0

問題スレッドをタイムアウトする方法提案された解決策は、実行するオブジェクトをExecutorService送信できるクラスで機能します。Runnable

このExecutorServiceクラスは、すべてのタスクの実行を停止するshutdownとの 2 つのメソッドを提供します。shutdownNowしかし、Java API は次のように述べていますshutdownNow

「アクティブに実行中のすべてのタスクを停止しようとし、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。アクティブに実行中のタスクの処理を停止するためのベスト エフォートの試行を超える保証はありません。たとえば、典型的な実装では、 Thread.interrupt() を介してキャンセルするため、割り込みに応答しないタスクは決して終了しない可能性があります。」

保証付きのタスクの終了を実行する方法がない場合、私は疑問に思っていましたか?

4

3 に答える 3

1

タスクの実装が制御できない場合、答えはノーです。

タスクの実装者は、終了方法を提供する責任と能力があります。それがなけれSystem.exit(-1)ば、タスクがデーモンスレッドを開いた場合でも、効果がない可能性があります...

于 2012-09-05T19:16:15.153 に答える
0

唯一の方法は非推奨の Thread.stop() を使用することですが、これは正当な理由により非推奨であり、使用すべきではありません。

したがって、答えはノーです。このタスクのコラボレーションがなければ、タスクを停止する方法はありません。停止を求められてもタスクが停止を拒否した場合、何もできません。

于 2012-09-05T19:14:34.280 に答える
0

可能ですが、多くのことを尊重する必要があります。

1) InterruptedException が正しく処理されていることを確認する必要があります。たとえば、シンクされていません。

2) スレッドの状態を確認する必要があります。たとえば、Thread.interrupted を呼び出します。

3) テスト後にスレッドの中断状態を復元する

4) すべてのカスタム I/O メソッドまたはループでこれを参照することを検討してください (適切な場合)。

「Java concurrency in practice」を読むことをお勧めします。この素晴らしい本には、スレッドの中断を修正し、物事が期待どおりに機能することを保証することに専念する章全体が含まれています。

于 2012-09-05T19:24:48.347 に答える