スレッドの run メソッドでストップファイルをチェックするアプローチを使用していますが、残りのすべてのタスクに対して空の実行が行われます。代わりに、executorservice 自体でタスクを停止する方法を探しています。それを行う方法はありますか。
ExecutorService
を停止する正しい方法は、メソッドを使用することだと思いますexecutorservice.shutdownNow();
。これにより、実行されていないジョブがキャンセルされ、実行中のすべてのスレッドが中断されます。
割り込みをテストするには、タスクで次のようなことを行う必要があります。
while (!Thread.currentThread().isInterrupted()) {
...
}
どこでもキャッチInterruptedException
したら、割り込みフラグを再度有効にする必要があります。
try {
// something that throws InterruptedException
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
// maybe we should quit the thread here
}
を食べる可能性のあるサードパーティのライブラリを使用している場合は、ジョブをキャンセルするがスレッドを中断しないInterruptedException
を使用する必要がある場合があります。次に、ある種のフラグ (または) を共有し、実行メソッドで何かを行う必要があります。executorservice.shutdown()
volatile boolean shutdown
AtomicBoolean
while (!Thread.currentThread().isInterrupted() && !shutdown) {
...
}
ところで、「スレッドの実行方法」について言及しています。念のためRunnable
、これらを実装して に提出する必要がありExecutorService
ます。Thread
インスタンスを送信しないでください。