2012-05-17 8 views

答えて

58

最も簡単な方法はtrueを返すようにThread.currentThread().isInterrupted()の原因となりますし、またどこスレッド、特定の状況下でInterruptedExceptionを投げる可能性がある、それinterrupt()にある:

ただし、ここでの回避策など、より詳細な情報を得ることができますあなたがCを必要とするrun()メソッド内などの例Thread.sleep()otherThread.join()object.wait()ため、

を待っていますその例外を処理したり、定期的にThread.currentThread().isInterrupted()の値をチェックして何かを行う(例えば、中断する)ことができます。

注:Thread.interrupted()isInterrupted()と同じように見えるが、それは厄介な副作用があります:isInterrupted()を呼び出すことはないのに対し、interrupted()を呼び出すは、interruptedフラグをクリアします。

その他の中断のない方法では、実行中のスレッドが監視するフラグ「stop」(volatile)を使用します。

5

ThreadPoolExecutorを使用し、submit()メソッドを使用すると、Futureが返されます。あなたのRunnableタスクを停止するには、返された未来にcancel()を呼び出すことができます。

+0

は、実行をキャンセルするが、それを保証するものではありません試みをキャンセルします。 – Rohit

6

中止のスレッドを中止するのは良い方法ではありません。より適切な方法は、プログラムでスレッドを返すことです。 Runnableオブジェクトにrun()メソッドの共有変数を使用させます。スレッドを停止させたい場合は、その変数をフラグとして使用します。

EDIT:サンプルコード

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); 
    } 
} 
+0

私のクラスでは、フラグをfalseに設定するメソッドを書いています。しかし、私はスレッドを停止する必要がある他のクラスからこのメソッドにアクセスすることができません。 – svkvvenky

+0

この_other class_はスレッドを開始するものですか? – Santosh

+0

はい、あなたは正しいです.... – svkvvenky

28

、Runnableインタフェースを実装することによって作成されたスレッドを停止する方法は?

スレッドを停止する方法はたくさんありますが、すべてのスレッドで特定のコードを使用する方法があります。スレッドを停止する一般的な方法はしょっちゅうスレッドをチェックしていること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を投げるためにいくつかの他の方法することができます。 ないは、必ずしもそれがすぐに例外をスローするようになりますそれは、interrupt()でスレッドを中断すること

public void run() { 
     while (!Thread.currentThread().isInterrupted()) { 
      // continue processing 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // good practice 
       Thread.currentThread().interrupt(); 
       return; 
      } 
     } 
    } 

注:また、のようなもので、スレッドの割り込みフラグのためにテストする必要があります。割り込み可能なメソッドにいる場合のみ、InterruptedExceptionがスローされます。

あなたがRunnableを実装して、あなたのクラスにshutdown()メソッドを追加したい場合は、あなたのような独自のクラスを定義する必要があります。

public class MyRunnable implements Runnable { 
    private volatile boolean shutdown; 
    public void run() { 
     while (!shutdown) { 
      ... 
     } 
    } 
    public void shutdown() { 
     shutdown = true; 
    } 
} 
+0

私のクラスでは、フラグ(あなたの例ではシャットダウン)をtrueに設定するメソッドを書いています。しかし、私はスレッドを停止する必要がある他のクラスからこのメソッドにアクセスできません。 – svkvvenky

+0

ええ、あなたは何とかそれを公開する必要があります。私は通常 'public class MyClassはRunnableを実装しています{volatile boolean shutdown; public void run(){if(!shutdown){...}}} '。シャットダウンフラグをセットする 'shutdown()'メソッドを追加することができます。それから、 'new Thread(new MyClass())。start();'を実行して実行します。 – Gray

0

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


         } 


        }); 


       }` 
関連する問題