ソースコードThreadPoolExecutor
を調べたところ、keepAliveTimeとallowCoreThreadTimeOutの設定値がtrueになると、すべてのアイドルワーカーが中断されることがわかりました。ThreadPoolExecutorはアイドルスレッドをどのように中断しますか?
それが唯一のinterruptメソッドを呼び出すことができます私には少し奇妙だときrunState> = SHUTDOWN:
次のコードは、メソッドThreadPoolExecutor
のgetTask()
からです。
Runnable getTask() {
...
if (workerCanExit()) {
if (runState >= SHUTDOWN) // Wake up others
interruptIdleWorkers();
return null;
}
}
それは(SHUTDOWN、STOPまたは終了)するときrunState> = SHUTDOWNすべてのアイドルスレッドのみを遮断することができるということですか?つまり、状態がRUNNINGのときに中断されることはありません。正確
私はrunStateはThreadPoolExecutorの状態だと思います。これは、シャットダウン方法でのみ変更できます。例えばコアプールサイズが10で、maxmunプールサイズが100で、keepAliveTimeが1分のThreadPoolExecutorを作成しました。エグゼクティブにプールのサイズを100にするために、100人のタスクをエグゼキュータに提供します。 100タスクのうち50タスクが完了しました。つまり、スレッドのうちの50個が現在アイドル状態です。しかし、runStateは実行中です。これらのアイドルスレッドは1分後に終了しますか? @Jacky; – Jacky
;いいえ、そうではありません。アイドル状態のスレッドが作業を待っている時間を定義します。スレッドは、 'corePoolSize'以上のものが存在する場合、または' allowCoreThreadTimeOut'の場合にこのタイムアウトを使用します。さもなければ、彼らは新しい仕事のために永遠に待つ。この例の –
の場合、corePoolSizeは10で100未満です。タスクキューは空であり、50人の作業者が作業しています。なぜ我々はCoreThreadTimeOutを許可して以来、50個のアイドルスレッドが終了しないのですか? – Jacky