実行可能なインターフェイスを実装してクラスを作成し、プロジェクトの他のクラスに多くのスレッド (10 近く) を作成しました。
それらのスレッドのいくつかを停止するにはどうすればよいですか?
6 に答える
最も簡単な方法は、interrupt()
それThread.currentThread().isInterrupted()
を返すことであり、スレッドが待機している特定の状況下で、、などtrue
をスローすることもあります。InterruptedException
Thread.sleep()
otherThread.join()
object.wait()
メソッド内では、run()
その例外をキャッチするか、Thread.currentThread().isInterrupted()
値を定期的にチェックして何かを実行する必要があります (たとえば、ブレークアウト)。
注:Thread.interrupted()
と同じようisInterrupted()
に見えますが、厄介な副作用があります。呼び出すとフラグinterrupted()
がクリアされますが、呼び出しはクリアされません。interrupted
isInterrupted()
他の中断のない方法にはvolatile
、実行中のスレッドが監視する「停止」( ) フラグの使用が含まれます。
実行可能なインターフェイスを実装して作成されたスレッドを停止するには?
スレッドを停止する方法は多数ありますが、いずれも特定のコードを使用して停止します。スレッドを停止する一般的な方法は、スレッドがvolatile boolean shutdown
頻繁にチェックするフィールドを用意することです。
// set this to true to stop the thread
volatile boolean shutdown = false;
...
public void run() {
while (!shutdown) {
// continue processing
}
}
sleep()
、wait()
、およびその他のメソッドが をスローする原因となるスレッドを中断することもできますInterruptedException
。また、次のようなスレッド割り込みフラグをテストする必要があります。
public void run() {
while (!Thread.currentThread().isInterrupted()) {
// continue processing
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// good practice
Thread.currentThread().interrupt();
return;
}
}
}
でスレッドを中断しても、すぐに例外がスローされるとは限らないことにinterrupt()
注意してください。割り込み可能なメソッドにいる場合にのみ、InterruptedException
がスローされます。
shutdown()
を実装するクラスにメソッドを追加する場合Runnable
は、次のように独自のクラスを定義する必要があります。
public class MyRunnable implements Runnable {
private volatile boolean shutdown;
public void run() {
while (!shutdown) {
...
}
}
public void shutdown() {
shutdown = true;
}
}
使用の途中でスレッドを停止Thread.stop()
することはお勧めできません。より適切な方法は、スレッドをプログラムで返すことです。Runnable オブジェクトがrun()
メソッドで共有変数を使用できるようにします。スレッドを停止したいときはいつでも、その変数をフラグとして使用してください。
編集: サンプルコード
class MyThread implements Runnable{
private Boolean stop = false;
public void run(){
while(!stop){
//some business logic
}
}
public Boolean getStop() {
return stop;
}
public void setStop(Boolean stop) {
this.stop = stop;
}
}
public class TestStop {
public static void main(String[] args){
MyThread myThread = new MyThread();
Thread th = new Thread(myThread);
th.start();
//Some logic goes there to decide whether to
//stop the thread or not.
//This will compell the thread to stop
myThread.setStop(true);
}
}
途中でスレッドを停止 (強制終了) することはお勧めしません。API は実際には非推奨です。
ただし、ここで回避策を含む詳細を取得できます: How do you kill a Thread in Java?
Thread.currentThread().isInterrupted() は見事に機能しています。しかし、このコードはタイマーを一時停止するだけです。
このコードは、スレッド タイマーを停止してリセットします。 h1 はハンドラ名です。 このコードは、ボタン クリック リスナー内に追加されます。w_h =分 w_m =ミリ秒 i=カウンター
i=0;
w_h = 0;
w_m = 0;
textView.setText(String.format("%02d", w_h) + ":" + String.format("%02d", w_m));
hl.removeCallbacksAndMessages(null);
Thread.currentThread().isInterrupted();
}
});
}`