例外が発生すると、ExecutorService で shutdownNow() を呼び出します。isTerminated() が成功ステータスを示し、すべてのスレッドが終了したときに true になり、それ以外の場合は false になると思いました。しかし、私は何があっても常に真実になります。推奨事項はありますか?
3 に答える
shutdownNow()
待機中のタスクを停止します。現在待機中のスレッドを実行する場合は、次を使用してみてくださいshutdown()
その上のjavadoc: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html#shutdown ()
の API ドキュメントに従って、andshutdownNow()
ではなく呼び出しているため、 isTerminated() は常に true を返していると思われます。shutdown()
shutdownNow()
... 典型的な実装は Thread.interrupt() 経由でキャンセルします
したがって、すべてのタスクが割り込みの試行にすぐに応答し、すぐに完了するように思えます。
ドキュメントが言うように、「isTerminated
shutdown または shutdownNow が最初に呼び出されない限り、真になることはありません」。したがって、タスクが成功したかどうかではなく、タスクが終了したかどうかのみがわかります。のようなフラグを設定し、AtomicBoolean
正常に完了する直前にその状態を切り替えることができます。このようにして、 のメソッドを使用ExecutorService
してタスクが終了したかどうかを確認し、フラグを使用してタスクが正常に終了したかどうかを確認します。