JAva ThreadPoolExecutor深化

1182 ワード

スレッド・プールの設計には、一般的に次の問題があります.
  1.スレッドはどのように再利用し、どのように保存しますか?
   2.スレッドが使用できない場合、コミットされた作業タスクは先に保存するか、拒否するか. 
JAvaのThreadPoolExecutorでは、スレッドの再利用にはワーククラスエンティティWorkerがワークスレッドに対応します.
Workerクラスが持つプロパティ:thread(ワークスレッド)、firstTask(このワークWorkerインスタンスを作成するときに入力されるビジネスタスク).
Workerクラスは、最初のタスクを消費すると、ワークキューからタスクが取得されるワークスレッドを表します.外部にワークスレッドのタイムアウト時間が設定されている場合(すなわち、現在のワークスレッドがコアスレッド数を超えた場合、この値は、このタイムアウト時間を超えた場合にワークスレッドを自動的に消去するように制御するために使用されます).
すべてのワークスレッドworkerインスタンスはworkersというhashSetに保存され、その後、スレッドプールを閉じると、このセットにループし、Workerクラスに対応するスレッドオブジェクトを取得してinterruptメソッドを呼び出します.
  
Wokerで重要なrunTaskメソッド:
まずfirstTaskを実行し、実行が完了したら、ワークキューからタスクを取得しようとし、成功すればワークタスクを実行します.ここではワークキューからタスクを取得し、タイムアウトとタイムアウトしない2つの取得方法があります.
スーパーを取得すると、このworkerは終了し、現在のwokerをworkers hashSetから削除し、現在のスレッドプールが生存しているスレッドの数を減らします.その後、このworker対応スレッドはjvmによって自動的に破棄され、最終的にはThreadのexitメソッドが呼び出されます.破棄後、現在のスレッドプールの生存スレッドがコアスレッド数より少ない場合、作業スレッドが補完されます.
注意:
allowCoreThreadTimeOutパラメータがtrueに設定されている場合、作業スレッド数がkeepTimeを超えていない場合でもオフになります.未設定が満たされている場合:
   1.作業スレッド数がコアスレッド数2より大きい.現在のスレッド取得タスクタイムアウト
この2つの条件がオフになります.