1. Thread クラスを継承し、run メソッドをオーバーライドします:
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 インターフェイスを実装しますrun メソッドをオーバーライドします。メソッド:
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. スレッド プールを使用します。スレッドを作成するには (ここでは提供されたスレッド プール フレームワーク Executor を使用してスレッド プールを作成します):
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()+"执行"); } }); } }
実際は非常に簡単で、アプリケーションのスタートアップ クラスに @EnableAsync アノテーションを配置するだけです。非同期アノテーションの使用を有効にして、ビジネス クラスのメソッドに @Async をマークします。
@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----->收到请求,写入数据库 "); }
最初にアノテーションを記述します:
@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface MyAsync { //规定value是异步开关 boolean value() default false; }
アノテーションの値をブール型に設定して、その true または 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 中国語 Web サイトの他の関連記事を参照してください。