Javaのスレッドプールを使用する前に、我々は書き込みThreadPoolExecutorスレッドプールのクラスを介して自分自身を実現するために最初にあり、その後、複数のスレッドのクラスを実行するスレッドプールを使用してメソッドを実行し、マルチスレッドのクラスを記述します。
春には、あなたは@Async(値=「beanId」)を使用スレッドプールへの注釈によって、プログラミング、マルチスレッドすることができます。
一つは、設定ファイルであるJavaプログラミングを介して行われ、2つの方法がありますが、スレッドプールを作成します。
スレッドプールの設定ファイルで作成された1、、、春の構成ファイル内のどこパッケージ複数のオープンコメントスレッドクラスをスキャンする設定ファイルを次の設定を追加します:
<?xmlのバージョン= "1.0"エンコード= "UTF-8">
<豆のxmlns = "http://www.springframework.org/schema/beans"
のxmlns:XSI = "http://www.w3.org / 2001 / XMLスキーマ・インスタンス"のxmlns:AOP = "http://www.springframework.org/schema/aop"
のxmlns:TX = "http://www.springframework.org/schema/tx"のxmlns:JDBC =" http://www.springframework.org/schema/jdbc "
のxmlns:コンテキスト= "http://www.springframework.org/schema/context" のxmlns:MVC =" http://www.springframework.org/schema/ MVC」のxmlns:タスク= "http://www.springframework.org/schema/task" のxsi:schemaLocationの=" http://www.springframework.org/schema/context http://www.springframework.org/schema /context/spring-context-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-豆-3.1.xsd のhttp://www.springframework。ORG /スキーマ/ JDBC http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/aop HTTP:/ /www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd 「 デフォルト-autowire =」BYNAME「>
<説明>私の春のスレッドプールの設定</説明>
< -設定@Async Notesのデフォルトパラメータとき非同期タスクmyExecutorのデフォルトのスレッドプール- >! <タスク:annotation-エグゼキュータ=ドリブン"myExecutor" />
<! -最初のスレッドプール- > <タスク:キュータID = "asyncExecutor"プールサイズ= "100" から10000キュー容量= 『10』 />
<! - 2番目のスレッドプール- > <タスク:キュータID = "myExecutor"プールサイズ= "15-50"キュー・定員= "100" =キープアライブ」 60 " 拒否-ポリシー=" CALLER_RUNS「/> </豆>
<タスク:キュータ/>の設定パラメータ:
ID:複数のエグゼキュータは、@Async(「ID」)を指定され、またプレフィックススレッド名として知られています。
プールサイズ:格式「コアサイズ、最大サイズ」
コアサイズ:最小スレッド数、デフォルト:1
最大サイズ:最大スレッド数、デフォルト:Integer.MAX_VALUEで
キュー容量:フルによって占有されているスレッドの最小数は、新しいタスクがキュー内に置くことができ、容量も満たされているキュー、スレッドの合計数まで、このタスクに対処するための新しいスレッドを作成しますプール最大サイズに達し、その後、システムは、タスクを拒否します(デフォルト設定の場合には、あなたが拒否-ポリシーによって、この状況をどのように処理するかを決めることができます)TaskRejectedExceptionに例外がスローされます。デフォルト値は次のとおりです。Integer.MAX_VALUEで
キープアライブ:これらのスレッドは、タスクのコアサイズが完了超え、その後、時間(秒)のこの長さの後に確定します
拒否ポリシー:プールが最大サイズに達したときに、どのように新しいタスクに対処します
ABORT(デフォルト):TaskRejectedExceptionは例外をスローし、DISCARDを実行していない:行っていない、例外はスローされません
DISCARD_OLDEST:最古のキュー、そのタスクを破棄
いないタスクを実行するために、新しいスレッドではなく、呼び出し側が実行するスレッドがあります:CALLER_RUNS
プラス@Async注釈方法
cn.leadeon.message.testパッケージ; インポートorg.springframework.context.annotation.ImportResource; インポートorg.springframework.scheduling.annotation.Async; インポートorg.springframework.stereotype.Component; @Component @ImportResource(" CLASSPATH:/ configに/spring-threadpool.xml 「) パブリック クラスAsyncTest {
//このメソッドは、スレッド・プールとしてデフォルトmyExecutorを使用して、デフォルトの注釈値パラメータである @Async 公共 のボイドTEST1(){ システム。OUTの .println(」非同期実行TEST1 !! !" ); システム。アウト .println(" 上記のIDの上にスレッド:"+ にThread.currentThread()のgetId())。 システム。アウト .println(" 线程名称:" + 。にThread.currentThread()のgetName()); }
//このメソッドは、パラメータ有するスレッドプールasyncExecutorを使用して、(値=「asyncExecutor」)を
@Async(値= "asyncExecutor") 公共ボイドTEST2(){ System.out.printlnは( "异步执行TEST2 !!!")。 System.out.println( "线程ID:" +にThread.currentThread()のgetId())。 System.out.println( "线程名称:"。+にThread.currentThread()のgetName()); }
}
スレッドを維持するためのアクチュエータ:testAsync方法、上記<アノテーションドリブン/タスク>外に呼び出すときには、新しいスレッドで実行されます。
概要:コンテキストでの最初の:春は、その後、タスクを@Asyncコメントを認識できるように、コンポーネント・スキャンは、ノートをスキャンする:注釈駆動型@Asyncノートを駆動するために、あなたはデフォルトのスレッドエグゼキュータを指定することができます。@Async注釈付きメソッドやクラスが呼び出されたときに、実行のスレッドが実行するための新しいスレッドを作成します。
2、ポイントに注意を払う:@EnableAsyncノートと<タスク:注釈駆動型のエグゼキュータ= 「messageExecutor」/> 同等の、両方の一つだけを使用し、または指定された開始
エグゼキュータ新しい構成クラスを作成し、@EnableAsyncノートへの道はここに移動しました:
@Configuration @EnableAsync パブリック クラスExecutorConfig { / * *設定ThreadPoolExecutorのコアプールサイズ。* / プライベート int型 corePoolSize = 10 ; / * * ThreadPoolExecutorの最大プールサイズを設定します。* / プライベート int型 maxPoolSize = 200 ; / * * ThreadPoolExecutorのBlockingQueueのための容量を設定します。* / プライベート int型の queueCapacity = 10 ; @Bean 公共執行mySimpleAsync(){ ThreadPoolTaskExecutorキュータ =新しいですThreadPoolTaskExecutor(); executor.setCorePoolSize(corePoolSize)。 executor.setMaxPoolSize(maxPoolSize)。 executor.setQueueCapacity(queueCapacity)。 executor.setThreadNamePrefix(" MySimpleExecutor- " ); executor.initialize(); リターンキュータ。 } @Bean 公共執行myAsync(){ ThreadPoolTaskExecutorキュータ = 新しいThreadPoolTaskExecutor()。 executor.setCorePoolSize(corePoolSize)。 executor.setMaxPoolSize(maxPoolSize)。 executor.setQueueCapacity(queueCapacity)。 executor.setThreadNamePrefix(" MyExecutor- " ); //拒否ポリシー:プールは、新しいタスク処理する方法を、最大サイズに達した // CALLER_RUNSを:新しいスレッドでタスクを実行していないが、呼び出し元が実行するスレッドがあり executor.setRejectedExecutionHandler(新新ThreadPoolExecutor.CallerRunsPolicyは()); executor.initialize(); 戻りキュータ; } }
この定義二つの異なる執行は、第2のプールは、時の処理方法最大サイズに達したリセット;接頭辞は、スレッド名を指定します。
マルチスレッドのクラスを書くことは、スレッドプールを使用しています。
@Component パブリック クラスAsyncTaskDemo4 { 保護された最終的なロガーロガー= LoggerFactory.getLogger(この.getClass())。 @Async(" mySimpleAsync " ) 公共フューチャー<文字列> doTask1()はInterruptedExceptionある{スロー logger.info(" タスク1が起動を" ); 長い =開始)(のSystem.currentTimeMillis。 Thread.sleep(5000 ); 長い端= にSystem.currentTimeMillis(); logger.info(「タスク1は、終了時間が経過した:{}ミリ秒。"エンドスタート); リターン 新しい AsyncResult <>(" タスク1を達成!" ); } @Async(" myAsync " ) 公共フューチャー<文字列> doTask2は()InterruptedExceptionある{スロー logger.infoを(" 。Task2のがスタート" ); 長い開始= にSystem.currentTimeMillis(); のThread.sleep(3000 ); 長い端= にSystem.currentTimeMillis(); logger.infoは(「タスク2が終了し、時間が経過した:{}ミリ秒。"、エンドスタート)。 返す 新しい AsyncResultを<>(" タスク2を達成!" ); } }
テスト結果:
2018 - 09 - 07 22:41:44.429 INFO 13640 --- [メイン] com.work.spring.thread.TaskTests2:開始TaskTests2 に 4.179秒(JVMが実行のために 5.853 ) 2018 - 09 - 07 22:41:44.525 INFO 13640 --- [MyExecutor- 1 ] cwspring.thread.demo4.AsyncTaskDemo4:Task2のがスタート。 2018年 - の09 - 07 22:41:44.525 INFO 13640 --- [impleExecutor- 1 ] cwspring.thread.demo4.AsyncTaskDemo4:タスク1が開始されました。 2018 - 09 - 07 22:41:47.526 INFO 13640は --- [MyExecutor- 1 ] cwspring.thread.demo4.AsyncTaskDemo4:タスク2が終了し、時間が経過:3001 ミリ秒。 2018 - 09 - 07 22:41:49.526 INFO 13640 --- [impleExecutor- 1] cwspring.thread.demo4.AsyncTaskDemo4:タスク1は、時間が経過し、終了した5001 41ミズ。 2018年 - の09 - 07 22:41:50.524 INFO 13640 --- [メイン] com.work.spring.thread.TaskTests2:タスク1の結果:タスク1を達成! 2018年 - の09 - 07 22:41:50.524 INFO 13640 --- [メイン] com.work.spring.thread.TaskTests2:Task2の結果:タスク2を達成! 2018年 - の09 - 07 22::50.524 INFO 13640 ---com.work.spring.thread.TaskTests2 [メイン]:すべてのタスクが終了しました。 2018年 - の09 - 07 22:41:50.528 INFO 13640 --- [スレッド3 ] ConfigServletWebServerApplicationContext:閉会org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@747f281:起動日[金9月07 22:41:40 CST 2018 ]; コンテキスト階層のルート 2018年 - の09 - 07 22:41:50.532 INFO 13640 --- [スレッド3 ] ossconcurrent.ThreadPoolTaskExecutor:ExecutorServiceのシャットダウン' myAsync '
プレフィックススレッド名は、我々は、スレッドプールを使用して、異なる2つのタスクを見ることができ、変更されています。