CPUコアの数が増えているため、マルチスレッドテクノロジーを使用してコンピューティングパワーを最大限に活用することは避けられません。したがって、マルチスレッドテクノロジーは、サーバー開発者が習得する必要があるテクノロジーです。
スレッドの作成と破壊にはシステムコールが含まれ、システムリソースが消費されるため、頻繁なスレッドの作成と破壊を避けるために、スレッドプーリングテクノロジーが導入されます。
Javaには、スレッドプールを作成できるエグゼクティブツールクラスがあります。本質は、SwreetPoolexecutorオブジェクトを新しいものにすることです。スレッドプールは、インタビューの質問でもほとんど必須です。このセクションでは、ソースコードを組み合わせて、swerchexecutorの実用的な原則について説明します
1。スレッドプール作成
まず、ThreadPoolexecutorの最も完全なコンストラクターパラメーターを見てみましょう。
corePoolsize:スレッドプールのコアスレッドの数。率直に言って、スレッドプールにタスクがない場合でも、タスクを待っているコアプールサイズのスレッドがあります。
maximumpoolsize:スレッドの最大数。提出したタスクの数に関係なく、スレッドプールのワーカースレッドの最大数はMaximumumpoolsizeです。
ceepAlivetime:スレッドのサバイバル時間。スレッドプール内のスレッドの数がCorePoolsizeよりも大きい場合、KeepAlivetimeを待った後に実行するタスクがない場合、スレッドは終了します。
unit:これは、sconds:timeunit.secondsなど、keepalivetimeの単位を指定するために使用されます。
workqueue:ブロッキングキュー、および提出されたタスクがこのキューに配置されます。
threadFactory:主にスレッドに名前を付けるために、スレッドを作成するために使用されるスレッドファクトリー。デフォルトの工場スレッド名はPool-1-Thread-3です。
Handler:スレッドプールのスレッドが使い果たされ、キューがいっぱいになったときに呼び出されるポリシーを拒否します。
上記は、スレッドプールを作成するときに使用されるパラメーターです。インタビュアーはしばしばインタビュー中にこの質問をします。
2。スレッドプール実行プロセス
こちらがスレッドプールの実行プロセスを説明するための図です
タスクがスレッドプールに送信されると、最初にスレッドの現在の数がcorepoolsizeよりも少ないかどうかを判断します。それが少ない場合、提出されたタスクを実行するためにスレッドが作成されます。それ以外の場合、タスクはworkqueueキューに配置されます。 WorkQueueがいっぱいの場合、現在のスレッド数がMaximumumpoolsizeよりも少ないかどうかを判断します。それが少ない場合、タスクを実行するためにスレッドが作成されます。それ以外の場合は、スレッドプールがタスクを受信することを拒否していることを示すために、ハンドラーが呼び出されます。
ここで、特定の実装を確認するための例として、JDK1.8.0_111のソースコードを使用します。
1.まず、スレッドプールのエグゼキューターメソッドを見てください
①:アクティブスレッドの現在の数がcorepoolsizeよりも少ないかどうかを判断します。それが少ない場合は、タスクを実行するためにスレッドを作成するためにAddWorkerに電話してください
②:CorePoolsize以上の場合は、タスクをWorkQueueキューに追加します。
③:WorkQueueがWorkQueueに配置されている場合、作成スレッドがタスクを実行します。この時点で作成スレッドが故障した場合(現在のスレッド数はMaximumumpoolsize以上です)、拒否は(内部コールハンドラー)と呼ばれ、タスクの受け入れを拒否します。
2。AddWorkerメソッドの実装を見てみましょう
このコードは、コア以外のスレッドを作成するとき、つまり、コアがfalseに等しくなります。現在のスレッド数がMaximumpoolsize以上かどうかを判断します。 false以上の場合、つまり、上記の③ではスレッドの作成が失敗しました。
AddWorkerメソッドの後半:
workerワーカーオブジェクトを作成し、スレッドオブジェクトをインスタンス化します。
このスレッドをスタートします
3.労働者に行って、その実装を確認します
スレッドを作成するためにワーカーを作成するときにスレッドファクトリーが呼び出されることがわかります。上記のスレッドを起動すると、スレッドで呼び出されるワーカーの実行方法がトリガーされます。
4.次に、Runworkerメソッドのロジックを見てみましょう。
スレッドはRunwokerを呼び出し、Loopをwhile workerqueueのタスクを読み取り、タスクを実行する間、GetTaskメソッドを呼び出します。 GetTaskメソッドがNULLを返さない限り、このスレッドは終了しません。
5.最後に、GetTaskメソッドの実装を見てみましょう
alowcorcoreThreadTimeoutを無視しましょう。この変数のデフォルト値はfalseです。 wc> corepoolsizeは、現在のスレッド数がcorepoolsizeよりも大きいかどうかを決定します。
corePoolsizeよりも現在のスレッド数が大きい場合、タスクを取得するためにWorkQueueのポーリング方法が呼び出され、タイムアウトはKeepAlivetimeです。 KeepAlivetimeの時間が時間制限を超えた場合、投票はNULLを返し、上記の範囲は順番に終了し、スレッドが実行されます。
現在のスレッド数がCorePoolsizeよりも少ない場合、WorkQueueのテイク方法は、現在ブロックするために呼び出されます。
上記の記事は、スレッドプールの作業原則とソースコードの解釈に基づいています。この記事は、編集者が共有するすべてのコンテンツです。私はそれがあなたに参照を与えることができることを願っています、そしてあなたがwulin.comをもっとサポートできることを願っています。