2012-04-30 7 views
1

ソースコードThreadPoolExecutorを調べたところ、keepAliveTimeとallowCoreThreadTimeOutの設定値がtrueになると、すべてのアイドルワーカーが中断されることがわかりました。ThreadPoolExecutorはアイドルスレッドをどのように中断しますか?

それが唯一のinterruptメソッドを呼び出すことができます私には少し奇妙だときrunState> = SHUTDOWN:

次のコードは、メソッドThreadPoolExecutorgetTask()からです。

Runnable getTask() { 
... 
if (workerCanExit()) { 
    if (runState >= SHUTDOWN) // Wake up others 
     interruptIdleWorkers(); 
    return null; 
    } 
} 

それは(SHUTDOWN、STOPまたは終了)するときrunState> = SHUTDOWNすべてのアイドルスレッドのみを遮断することができるということですか?つまり、状態がRUNNINGのときに中断されることはありません。正確

答えて

2

あなたが正しいです。 ThreadPoolExecutorのこのgetTask()メソッドは、ワーカースレッドの次のタスクを実行するために呼び出されます。このコードブロックは、メソッド呼び出しが実行のためのRunnableタスクを特定していない場合にのみ実行されます。したがって、実行するものが見つからなければ、シャットダウン状態をチェックする必要があります。タスクの取得に失敗したワーカースレッドが終了することができるかどうかworkerCanExit()

チェックのJavaのドキュメントから

。コアのタイムアウトが許可されていても、プールが停止しているか、キューが空であるか、空ではないキューを処理するためのスレッドが少なくとも1つあれば、ワーカースレッドは終了します。

+0

私はrunStateはThreadPoolExecutorの状態だと思います。これは、シャットダウン方法でのみ変更できます。例えばコアプールサイズが10で、maxmunプールサイズが100で、keepAliveTimeが1分のThreadPoolExecutorを作成しました。エグゼクティブにプールのサイズを100にするために、100人のタスクをエグゼキュータに提供します。 100タスクのうち50タスクが完了しました。つまり、スレッドのうちの50個が現在アイドル状態です。しかし、runStateは実行中です。これらのアイドルスレッドは1分後に終了しますか? @Jacky; – Jacky

+0

;いいえ、そうではありません。アイドル状態のスレッドが作業を待っている時間を定義します。スレッドは、 'corePoolSize'以上のものが存在する場合、または' allowCoreThreadTimeOut'の場合にこのタイムアウトを使用します。さもなければ、彼らは新しい仕事のために永遠に待つ。この例の –

+0

の場合、corePoolSizeは10で100未満です。タスクキューは空であり、50人の作業者が作業しています。なぜ我々はCoreThreadTimeOutを許可して以来、50個のアイドルスレッドが終了しないのですか? – Jacky

0

。正しいタスク(中断が許可されている場合)は、中断されたフラグと終了(つまりrun()からの復帰)をチェックする必要があります。

関連する問題