68

実行可能なインターフェイスを実装してクラスを作成し、プロジェクトの他のクラスに多くのスレッド (10 近く) を作成しました。
それらのスレッドのいくつかを停止するにはどうすればよいですか?

4

6 に答える 6

83

最も簡単な方法は、interrupt()それThread.currentThread().isInterrupted()を返すことであり、スレッドが待機している特定の状況下で、、などtrueをスローすることもあります。InterruptedExceptionThread.sleep()otherThread.join()object.wait()

メソッド内では、run()その例外をキャッチするか、Thread.currentThread().isInterrupted()値を定期的にチェックして何かを実行する必要があります (たとえば、ブレークアウト)。

注:Thread.interrupted()と同じようisInterrupted()に見えますが、厄介な副作用があります。呼び出すとフラグinterrupted() がクリアされますが、呼び出しはクリアされません。interruptedisInterrupted()

他の中断のない方法にはvolatile、実行中のスレッドが監視する「停止」( ) フラグの使用が含まれます。

于 2012-05-17T06:22:57.913 に答える
42

実行可能なインターフェイスを実装して作成されたスレッドを停止するには?

スレッドを停止する方法は多数ありますが、いずれも特定のコードを使用して停止します。スレッドを停止する一般的な方法は、スレッドが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;
    }
}
于 2012-05-17T12:23:24.590 に答える
11

使用の途中でスレッドを停止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);
    }
}
于 2012-05-17T06:36:02.930 に答える
6

を使用し、 submit()メソッドを使用すると、ThreadPoolExecutor返されます。返された Future でcancel()を呼び出して、タスクを停止できます。FutureRunnable

于 2012-05-17T06:23:02.280 に答える
2

途中でスレッドを停止 (強制終了) することはお勧めしません。API は実際には非推奨です。

ただし、ここで回避策を含む詳細を取得できます: How do you kill a Thread in Java?

于 2012-05-17T06:21:01.707 に答える
-2

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();


                        }


                    });


                }`
于 2017-01-04T06:49:03.433 に答える