序文
この記事では、主に、Spring Boot Integrationの非同期コールに関する関連するコンテンツを紹介します。参照と学習のために共有されます。以下ではあまり言いません。詳細な紹介を一緒に見てみましょう。
非同期呼び出しとは何ですか?
非同期呼び出しは、同期コールに関連しています。同期呼び出しは、事前に決定された順序で段階的に実行されているプログラムを指します。前のステップが実行されるまで、各ステップを実行する必要があります。非同期コールは、以前のプログラムが実行されるのを待つ必要はありません。
非同期処理方法
非同期呼び出しを実装する方法は?
マルチスレッドは、多くの人が最初に考えるキーワードです。はい、マルチスレッドは非同期呼び出しを実装する方法です。
非スプリングプロジェクトでは、非同期呼び出しを実装し、マルチスレッドメソッドを使用したり、実行可能なインターフェイスを実装したり、スレッドクラスを統合したり、JDK1.5以上で提供されているエグゼクティブスレッドプールを使用したりすることをお勧めします。
strngbootは、非同期コールを実行するための非常に便利な方法を提供します。
公式の例に従ってください
コードを入力します
Maven依存関係:
<parent> groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-parent </artifactid> <バージョン> 1.5.3.3.3.release </version> </parent> <dependencies> <依存症</dependency> </dependencies>
クラスを開始します:@enableasync annotationを追加します
@springBootApplication @enableasync public class application {public static void main(string [] args){springApplication.run(application.class、args); }}コントローラ
非同期に実行するために必要なメソッドに@Asyncアノテーションを追加するだけです
@RestController @RequestMapping( "")Public Class AsynctaskController {@RequestMapping( "")public String dotask()throws interruptedException {long currentTimeMillis = System.CurrentTimeMillis(); this.task1(); this.task2(); this.task3(); long CurrentTimemillis1 = System.CurrentTimemillis(); return "タスクタスクの合計時間は消費されます:"+(currenttimemillis1-currenttimemillis)+"ms"; } @async public void task1()throws arturnedexception {long currenttimemillis = system.currenttimemillis(); thread.sleep(1000); long CurrentTimemillis1 = System.CurrentTimemillis(); system.out.println( "task1タスクが消費される時間:"+(currentTimeMillis1-currenttimemillis)+"MS"); } @async public void task2()throws arturnedexception {long currentTimemillis = System.CurrentTimeMillis(); Thread.Sleep(2000); long CurrentTimemillis1 = System.CurrentTimemillis(); System.out.println( "task2タスク時間抑制:"+(currentTimemillis1-currenttimemillis)+"MS"); } @async public void task3()throws arturnedexception {long currentTimemillis = System.CurrentTimeMillis(); thread.sleep(3000); long CurrentTimemillis1 = System.CurrentTimemillis(); system.out.println( "task3タスク時間消費:"+(currenttimemillis1-currenttimemillis)+"ms"); }}メイン関数は、spirngbootプロジェクトを実行します。起動が完了した後、ブラウザにアクセスします:http:// localhost:8080/
コンソール:
タスク1タスク時間:1012msタスク2タスク時間:2009msタスク3タスク時間:3004ms
しばらく待った後、出力が入力されます。
合計タスク時間:6002ms
非同期に実行されません!
コードが間違って書かれているのでしょうか?何度かチェックしましたが、明らかなエラーは見つかりませんでした。春は@Transactional Annotationにも同様の問題があったことを覚えています。 @TransactionAl Annotationメソッドでクラスをスキャンすると、プロキシクラスが生成され、プロキシクラスがトランザクションを開始および閉じます。同じクラスでは、メソッドコールがクラス本体で実行され、Springはこのメソッドコールを傍受することはできません。
突然、非同期タスクを個別にクラスに入れ、コードを調整して入力します。
コントローラ
@RequestMapping( "")@RestController public class asynctaskController {@autowired private asynctask asynctask; @RequestMapping( "")public string dotask()throws arturnedexception {long currenttimemillis = system.currenttimemillis(); asynctask.task1(); asynctask.task2(); asynctask.task3(); long CurrentTimemillis1 = System.CurrentTimemillis(); return "タスクタスク合計時間消費:"+(currentTimeMillis1-currentTimemillis)+"MS"; }}非同期タスククラス
@component public class asynctask {@async public void task1()throws arturnedexception {long currenttimemillis = system.currenttimemillis(); thread.sleep(1000); long CurrentTimemillis1 = System.CurrentTimemillis(); System.out.println( "task1 task time-suming:"+(currenttimemillis1-currenttimemillis)+"ms"); } @async public void task2()throws arturnedexception {long currentTimemillis = System.CurrentTimeMillis(); Thread.Sleep(2000); long CurrentTimemillis1 = System.CurrentTimemillis(); System.out.println( "task2タスク時間抑制:"+(currentTimemillis1-currenttimemillis)+"MS"); } @async public void task3()throws arturnedexception {long currentTimemillis = System.CurrentTimeMillis(); thread.sleep(3000); long CurrentTimemillis1 = System.CurrentTimemillis(); system.out.println( "task3タスク時間消費:"+(currenttimemillis1-currenttimemillis)+"ms"); }}コンソール:
タスク1タスク時間:1012msタスク2タスク時間:2009msタスク3タスク時間:3004ms
ブラウザの結果を入力してください:
合計タスク時間:19ms
非同期コールが成功しました!
3つの非同期タスクがいつ実行され、実行の結果はどうなりますか?あなたは容疑者のコールバックを追加する方法を使用して裁判官
コードが入力されます:
非同期タスククラス
@component public class asynctask {@async public future <string> task1()throws arturnedexception {long currenttimemillis = system.currenttimemillis(); thread.sleep(1000); long CurrentTimemillis1 = System.CurrentTimemillis(); System.out.println( "task1 task time-suming:"+(currenttimemillis1-currenttimemillis)+"ms"); new asyncresult <string>( "task1実行が完了しました"); } @async public Future <string> task2()throws arturnedexception {long currentTimemillis = System.CurrentTimeMillis(); Thread.Sleep(2000); long CurrentTimemillis1 = System.CurrentTimemillis(); System.out.println( "task2タスク時間抑制:"+(currentTimemillis1-currenttimemillis)+"MS"); new asyncresult <string>( "task2実行が完了しました"); } @async public Future <string> task3()throws interruptedexception {long currenttimemillis = system.currenttimemillis(); thread.sleep(3000); long CurrentTimemillis1 = System.CurrentTimemillis(); system.out.println( "task3タスク時間消費:"+(currenttimemillis1-currenttimemillis)+"ms"); new asyncresult <string>( "task3実行完了"); }}コントローラ
@RequestMapping( "")@RestController public class asynctaskController {@autowired private asynctask asynctask; @RequestMapping( "")public string dotask()throws arturnedexception {long currenttimemillis = system.currenttimemillis(); future <string> task1 = asynctask.task1(); future <string> task2 = asynctask.task2(); future <string> task3 = asynctask.task3();文字列結果= null; for(;;){if(task1.isdone()&& task2.isdone()&& task3.isdone()){// 3つのタスクはすべて呼び出され、ループを終了し、休憩を待ちます。 } thread.sleep(1000); } long CurrentTimemillis1 = System.CurrentTimemillis(); result = "タスクの合計時間消費:"+(currenttimemillis1-currenttimemillis)+"ms";返品結果; }}コンソール出力:
タスク1タスク時間:1000msタスク2タスク時間:2001msタスク3タスク時間:3001ms
ブラウザ出力:
合計タスク時間:4015ms
非同期コールは成功し、プログラムはすべてのタスクが完了したときにのみ結果を返します!
要約します
上記は、この記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。