2

実行中に、単一のスレッドを正常にシャットダウンしたいとします

安全でない動作のため、使用したくありませんThread.stop()Thread.destroy()

注: 私はExecutorService.shutdown()オプションの使用に精通しています。しかし、私は実装する他の方法を知りたいです。

4

4 に答える 4

4

スレッドを停止する標準的な方法は、を呼び出すことthread.interrupt();です。それを機能させるには、スレッドが中断に応答することを確認する必要があります。次に例を示します。

Thread t = new Thread(new Runnable() { public void run {
    while(!Thread.currentThread().isInterrupted()) {
        //your code here
    }
}});
t.start();
t.interrupt();

これは、条件が定期的にチェックされている場合にのみ機能します。割り込みメカニズムを割り込み可能なメソッドに委任できることに注意してください(通常、I / O、ブロックキュー、スリープ/待機は、割り込みが発生するまでブロックできるメソッドを提供します)。

注:この例では、次も使用できます。

    while(!interrupted()) {
        //your code here
    }

interrupted()Thread.currentThread().isInterrupted()中断されたフラグがリセットされることを除いて、同じことを行います。それはあなたのスレッドなので、問題ではありません。

于 2013-02-10T10:44:05.467 に答える
1

run()なんらかの理由でスレッドのメソッドを終了させなければなりません。これを達成する方法は、スレッドが何をするかによって異なります。

  • スレッドがループしている場合は、フラグを立てて停止できます (ループの状態によってチェックされます)。
  • Socketスレッドが 1つまたは他のストリームを待機している場合は、ストリームを閉じます。
  • をスローする可能性のある呼び出しでスレッドがブロックされている場合は、スレッドを呼び出して例外を無視できますInterruptedExceptioninterrupt()
  • スレッドがブロッキング キューの要素を消費している場合は、ポイズン ピルメソッドを使用します。これは、単に「ループを停止する」ことを意味する要素をキューに置くことを意味します。
于 2013-02-10T10:41:06.793 に答える
1

isStopped()コードにフラグを含めることができます。また、実行中のスレッドは、このフラグを定期的にチェックして、停止する必要があるかどうかを確認する必要があります。スレッドを正常に停止するには、実行中のコードを停止できるように記述する必要があることに注意してください。

より詳細な回答については、この質問をご覧ください。

于 2013-02-10T10:42:08.523 に答える
0

run()メソッド内にループがある場合Thread、1 つのオプションは、ループが反復ごとにフラグの値をチェックすることです。

スレッドが次の反復を開始する前に実行を停止するなど、コードの外部からフラグを設定できます。

于 2013-02-10T10:40:21.083 に答える