実行中に、単一のスレッドを正常にシャットダウンしたいとします。
安全でない動作のため、使用したくありませんThread.stop()
。Thread.destroy()
注: 私はExecutorService.shutdown()
オプションの使用に精通しています。しかし、私は実装する他の方法を知りたいです。
実行中に、単一のスレッドを正常にシャットダウンしたいとします。
安全でない動作のため、使用したくありませんThread.stop()
。Thread.destroy()
注: 私はExecutorService.shutdown()
オプションの使用に精通しています。しかし、私は実装する他の方法を知りたいです。
スレッドを停止する標準的な方法は、を呼び出すこと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()
中断されたフラグがリセットされることを除いて、同じことを行います。それはあなたのスレッドなので、問題ではありません。
run()
なんらかの理由でスレッドのメソッドを終了させなければなりません。これを達成する方法は、スレッドが何をするかによって異なります。
Socket
スレッドが 1つまたは他のストリームを待機している場合は、ストリームを閉じます。InterruptedException
。interrupt()
isStopped()
コードにフラグを含めることができます。また、実行中のスレッドは、このフラグを定期的にチェックして、停止する必要があるかどうかを確認する必要があります。スレッドを正常に停止するには、実行中のコードを停止できるように記述する必要があることに注意してください。
run()
メソッド内にループがある場合Thread
、1 つのオプションは、ループが反復ごとにフラグの値をチェックすることです。
スレッドが次の反復を開始する前に実行を停止するなど、コードの外部からフラグを設定できます。