Runnableから実行されるがありますExecutor。
ランナブルはで待機してブロックされSychronousQueue.takeます。take中断するときに中断されることを確認するにはどうすればよいexecutor.shutdownですか?
3 に答える
あなたはこのようなことをすることができますか?
executor.shutdown();
if (!executor.awaitTermination(SHUTDOWN_TIME)) {
executor.shutdownNow();
}
@Eugeneに+1。 ExecutorService.shutdown()スレッドプールをシャットダウンしますが、送信されたジョブは終了するまで実行を継続します。代わりに使用shutdownNow()すると、実際にはスレッドが中断されます。これは、それらがすぐに停止することを意味するわけではありませんが、ブロックされた場合、queue.take()または次の呼び出しqueue.take()がスローされInterruptedExceptionてスレッドが終了できることを意味します。
Javadocから引用するには:
アクティブに実行されているすべてのタスクを停止し、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。
アクティブに実行されているタスクの処理を停止するための最善の試み以外の保証はありません。たとえば、通常の実装はThread.interrupt()を介してキャンセルされるため、割り込みに応答できないタスクは決して終了しない可能性があります。
スレッドが呼び出しqueue.take()ているときは、次のようなコードが必要です。
try {
work = queue.take();
...
} catch (InterruptedException e) {
// re-interrupt the thread which is always a good pattern
Thread.currentThread().interrupt();
// quit the processing thread
return;
}
takeのjavadocで指定されているようInterruptedExceptionに、待機中のスレッドが中断されると、がスローされます。したがって、エグゼキュータの実装が、を所有するすべてのスレッドでThread.interrupt()を呼び出すことを確認する必要がありますshutdown。