この記事では、スプリングスレッドプールスレッドPooltasKexecutorの構成を紹介し、次のように共有しています。
1。ThreadPooltasKexecutor構成
<! - スプリングスレッドプールエグゼキューター - > <bean id = "taskexecutor"> <! - スレッドプールによって維持されるスレッドの最小スレッド数 - > <プロパティ名= "corepoolsize" value = "5" /> <! - 許可されたアイドル時間 - > <プロパティname = "keepaliveseconds" value = "200" /> <! /> <! - キャッシュキュー - > <プロパティ名= "queuecapacity" value = "20" /> <! - タスクを拒否するためのポリシーの処理 - > <プロパティ名= "rejectedexecutionhandler"> <bean /> < /jepperty> < /bean> < /bean>
属性フィールドの説明
corepoolsize:スレッドプールによって維持されるスレッドの最小数
Keepaliveseconds:自由時間が許可されています
maxpoolsize:スレッドプールによって維持されるスレッドの最大数
QueueCapacity:キャッシュキュー
拒否ExexeCutionHandler:タスクを拒否するためのハンドリング戦略
2。実行(実行可能)メソッド実行プロセス
この時点でスレッドプールの数がCorePoolsizeよりも少ない場合、スレッドプールのスレッドがすべてアイドル状態であっても、追加されたタスクを処理するために新しいスレッドを作成する必要があります。
スレッドプールの数値がCorePoolsizeに等しいが、バッファキューワークキューがいっぱいでない場合、タスクはバッファキューに配置されます。
この時点でスレッドプールの数がcorepoolsizeよりも大きい場合、バッファキューワークキューがいっぱいであり、スレッドプールの数がmaxpoolsizeよりも少ない場合、追加されたタスクを処理する新しいスレッドを作成します。
この時点でスレッドプールの数値がCorePoolsizeよりも大きい場合、バッファキューワークキューがいっぱいであり、スレッドプールの数値がMaxPoolsizeに等しい場合、このタスクはハンドラーによって指定されたポリシーを介して処理されます。つまり、タスクの処理の優先順位は次のとおりです。コアスレッドCorePoolsize、タスクキューワークキュー、最大スレッドMaximumMumpoolsizeです。 3つすべてがいっぱいの場合は、ハンドラーを使用して拒否されたタスクを処理します。
スレッドプールのスレッドの数がCorePoolsizeよりも大きい場合、スレッドがKeepAlivetime以上にアイドル状態である場合、スレッドは終了します。このようにして、スレッドプールはプール内のスレッドの数を動的に調整できます。
3。サンプルコード
Junitテスト
@runwith(springjunit4classrunner.class)@contextconfiguration(classes = {multithreadconfig.class})public class multithreadtest {@autowired private pootooltaskexecutor taskexecutor; @autowired private multithreadprocessservice multithreadprocessservice; @test public void test(){int n = 20; for(int i = 0; i <n; i ++){taskexecutor.execute(new multithreaddemo(multithreadprocessservice)); system.out.println( "int i as" + i + "、swrechpoolアクティブスレッドTotalnum is" + taskexecutor.getactivecount()); } try {system.in.read(); } catch(ioexception e){new new runtimeexception(e); }}}multithreaddemo
/** * Multithread Concurrent Processing Demo * @Author Daniel.Zhao * */Public Class MultithReadDemoはrunnable {private multithreadprocessservice multithreadprocessservice; public MultithreadDemo(){} public MultithreadDemo(multithreadProcessService multithreadprocessService){this.multithreadprocessService = multithreadprocessservice; } @Override public void run(){multithreadprocessservice.processsomething(); }}multithreadProcessService
@ServicePublic Class MultithReadProcessService {public static final logger logger = logger.getLogger(multithreadprocessservice.class); / ** *デフォルトの処理プロセスには1000msが必要です */ public void processsomething(){logger.debug( "multithreadprocessservice-processsomething" + thread.currentthread() + "...... start"); try {thread.sleep(1000); } catch(arturtedexception e){新しいruntimeexception(e); } logger.debug( "multithreadprocessservice-processsomething" + thread.currentthread() + "...... end"); }}multithreadconfig
@configuration @componentscan(basepackages = {"com.xxx.multithread"})@importresource(value = {"classpath:config/application-task.xml"})@enableScheduling public class multithreadconfig {}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。