1. Thread 클래스 상속 및 실행 메서드 재정의:
public class ExtendsThread extends Thread{ @Override public void run() { try{ System.out.println(Thread.currentThread().getName()+"执行"); }catch (Exception e){ } } public static void main(String[] args) { new Thread(new ExtendsThread()).start(); } }
2 Runnable 인터페이스 구현 및 실행 메서드 재정의:
public class ImplementsRunnable implements Runnable{ @Override public void run() { try{ System.out.println(Thread.currentThread().getName()+"执行"); }catch (Exception e){ } } public static void main(String[] args) { new Thread(new ImplementsRunnable()).start(); //这里还可以使用匿名内部类的写法创建一个线程 new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()+"执行"); } },"匿名内部类实现Runnable接口的线程"); } }
3 . Callable 인터페이스를 구현하고 FutureTask를 사용하여 스레드를 생성합니다(반환 값을 얻을 수 있음):
public class CallableAndFuture implements Callable<String> { @Override public String call() throws Exception { Thread.sleep(3000); System.out.println(Thread.currentThread().getName()+"执行"); return "success"; } public static void main(String[] args) throws ExecutionException, InterruptedException { FutureTask<String> futureTask = new FutureTask<>(new CallableAndFuture()); // futureTask.run(); 主线程执行call方法 new Thread(futureTask).start(); String result = futureTask.get(); System.out.println(result); } }
4. 스레드 풀을 사용하여 스레드를 생성합니다(여기서는 제공된 스레드 풀 프레임워크 실행기를 사용하여 스레드 풀을 생성합니다). :
public class Executor { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); executorService.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()+"执行"); } }); } }
@SpringBootApplication @EnableAsync public class AopApplication { public static void main(String[] args) { SpringApplication.run(AopApplication.class, args); } }
비즈니스 클래스 방법(예):
@Async public void insertDb(){ /*service code......*/ System.out.println("2----->收到请求,写入数据库 "); }
3. 그런 다음 사용자 정의 주석을 사용하여 비동기 작업을 구현하는 방법을 설계해 보겠습니다.
@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface MyAsync { //规定value是异步开关 boolean value() default false; }
주석의 값을 부울 유형으로 설정합니다. 참 또는 거짓 값을 기반으로 비동기 스레드 생성을 결정합니다.
비즈니스 클래스의 메소드에 배치합니다:
@MyAsync(value = true) public void deleteDb(){ /*service code......*/ System.out.println("delete------>数据删除"); }
그런 다음 AOP를 사용하여 이 주석을 스캔합니다.
Aspect @Component public class AopUtils { @Around(value = "@annotation(com.example.aop.Aop异步.MyAsync)") public void listenMyAsync(ProceedingJoinPoint joinPoint) throws Throwable { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); MyAsync annotation = method.getAnnotation(MyAsync.class); boolean value = annotation.value(); if (value) new Thread(new Runnable() { @SneakyThrows @Override public void run() { joinPoint.proceed(); } }).start(); else joinPoint.proceed(); } }
캡처한 후 실행 스레드에서 주석이 포함된 메소드 스택을 찾기 위해 Around를 사용하는 것을 볼 수 있습니다. 즉, 해당 연결점 개체를 얻을 수 있습니다.
연결점 개체 ProcedJoinPoint의 getSignture 메서드를 사용하여 서명을 메서드 서명 MethdSignture 유형으로 변환한 다음 이 유형의 getMethod 메서드를 사용하여 메서드 자체를 얻을 수 있습니다. 메서드의 주석을 얻고 주석의 속성을 사용하여 메서드가 동기적으로 전달되는지 아니면 비동기적으로 전달되는지를 결정하기 위해 값의 true 또는 false 값을 직접 얻을 수 있습니다. (소스 코드는 반사 메커니즘을 활용합니다).
위 내용은 Springboot가 Aop 캡처 주석을 사용하여 비즈니스 비동기 실행을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!