0

毎日多数のスレッドを実行する必要があります。各スレッドはいくつかのタスクを実行します。私が解決しようとしている問題は、パラメーターとして渡される停止ファイルを使用してエグゼキューター サービスを正常に終了するかどうかです。

スレッドの run メソッドでストップファイルをチェックするアプローチを使用していますが、残りのすべてのタスクに対して空の実行が行われます。代わりに、executorservice 自体でタスクを停止する方法を探しています。それを行う方法はありますか。

私はこの投稿を見ていました: ThreadPoolExecutor のキューに入れられたすべてのタスクを削除する

誰かがこれについてさらに拡張できますか?

4

1 に答える 1

1

スレッドの 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 shutdownAtomicBoolean

while (!Thread.currentThread().isInterrupted() && !shutdown) {
    ...
}

ところで、「スレッドの実行方法」について言及しています。念のためRunnable、これらを実装して に提出する必要がありExecutorServiceます。Threadインスタンスを送信しないでください。

于 2013-09-19T20:59:33.917 に答える