Javaスレッドプールの原理と使用

Javaコンカレントプログラミングでは、スレッドプールは多くのリソースを使用する同時実行フレームワークです。スレッドプールを合理的に使用することで、リソース消費を削減し、応答速度を向上させ、スレッドの管理性を向上させることができます。

では、スレッドプールの実現原理は何ですか?

新しいタスクの処理フローを通じてスレッドプールの原理を説明します。新しいタスクがスレッドプールに送信されると、スレッドプールは、corePool内のスレッドがすべてタスクを実行しているかどうかを判断し、実行していない場合は、新しいスレッドを作成します。このタスクを実行するには、それ以外の場合は、BlockingQueueがいっぱいかどうかを判断し、BlockingQueueがいっぱいでない場合は、タスクをその中に格納します。BlockingQueueがいっぱいの場合、スレッドプールは、スレッドプール内のスレッドがすべて動作状態にあるかどうかを判断します。そうでない場合は、タスクを実行するための新しいスレッドが作成されます。そうでない場合、タスクは飽和戦略に引き渡されます。

上図に示すように、これはスレッドプールの一般的な処理フローです。

ここで、corePoolSize、BlockingQueue、maximumPoolSizeの意味を説明します。

corePoolSize:コアスレッドプールのサイズ、つまりコアスレッドプール内のスレッドの数。コアスレッドプール内のスレッドの数がこの値より少ない場合、タスクを処理するためのスレッドが作成されます。

BlockingQueue:タスクを格納するために使用されるキューです。コアスレッドプールがいっぱいで、キューがいっぱいでない場合、タスクはキューに格納されます。

maximumPoolSize:スレッドプール内のスレッドの最大数。キューがいっぱいであるが、スレッドプールの数がこの値に達していない場合、処理用のスレッドが作成されます。

では、スレッドプールの特定の実行ステップは何ですか?

スレッドプールのexecute()メソッドがタスクを実行する状況は4つあります。

1.現在実行中のスレッドの数がcorePoolSize未満の場合は、タスクを実行するための新しいスレッドを作成します。

2.実行中のスレッドの数がcorePoolSizeより大きい場合は、このタスクをBlockingQueueに追加します。

3. BlockingQueueがいっぱいの場合、タスクをキューに追加できません。その後、タスクを実行するための新しいスレッドが作成されます。

4.現在実行中のスレッドの数がmaximumPoolSizeと等しい場合、スレッドプールはポリシーを通じてタスクを拒否します。

スレッドプールの実行図は次のとおりです。


スレッドプールの実行プロセスと原理を理解してから、スレッドプールの使用法、主にスレッドプールのいくつかのパラメーターの設定を確認します。

ThreadPoolExecutor threadPoolExecutor = new 
				ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);

設定できるパラメータは、corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handlerであることがわかります。CorePoolSizeとmaximumPoolSizeについては、すでに説明しました。他のパラメータの意味を説明しましょう。

keepAliveTime:スレッドの存続時間。スレッドにタスクが実行されていない場合、存続する時間。スレッドのアイドル時間がこの値を超えると、スレッドは破棄されます。

unit:keepAliveTimeの時間単位、オプションの単位は日、時間、秒などです。

workQueue:キャッシュタスクのキューイング戦略を決定します。シナリオごとに異なるブロッキングキューが使用されます。一般的に使用されるブロッキングキューには、SynchronousQueueとLinkedBlockingQueueの2つがあります。

threadFactory:スレッドを作成するためのファクトリを設定するために使用されます。スレッドファクトリを介して、作成された各スレッドに意味のある名前を設定できます。

ハンドラー:スレッドプールの処理戦略。スレッドプールのスレッドがmaximumPoolSizeに達すると、スレッドプールはタスクを処理するためのスレッドを作成しなくなり、タスクはスレッドプールの処理戦略を通じて処理される必要があります。

これでスレッドプールは終わりです。便利だと思う人は誰でも気に入るはずです。

おすすめ

転載: blog.csdn.net/wzs535131/article/details/103813081