0

だから私は他のすべてのスレッドを担当する私のMainThreadクラスを持っています(作成、停止、監視)

 public class MainThread implements Runnable {
      public static volatile boolean keepRunning = true;  

      public void run(){


      //some code..


      while(keepRunning){

      //here i am creating threads for my Wired class (explaining below) 
      //that are stored in a hashmap

      Wired wiredInterface = new Wired(s,defaultSleepTime,c,max,percent);
      Thread t1 = new Thread(wiredInterface);
      t1.start();
      }

私のコードのずっと下に、スレッドt1を停止する必要がある場合があります。

私の有線クラス:

   public class Wired implements Runnable {
        private static volatile boolean keepRunning = true;

        public void run(){

        while(keepRunning){

        //code

        try{
            Thread.sleep(((k - i + 1)*defaultTime) - DT);  //just to show that this thread sleeps periodically. doesnt affect the question
        }catch(InterruptedException e){e.printStackTrace();}  

        }
        }

私のWiredクラスには、揮発性フラグを変更するためのこのメソッドがあります。

        public static void stopRunning(){
            keepRunning = false;
        }

私の質問は..停止したい特定のスレッドのMainThreadからメソッドstopRunningにアクセスするにはどうすればよいですか?Thread.interrupt()は、解決策としては機能しません。

私はこの主題に関して多くの同様の質問を見てきましたが、私の場合に適したものを見つけられませんでした。私が何かを逃した場合は申し訳ありませんこのコードは私の実際のコードを過度に単純化したものです

4

2 に答える 2

1

keepRunningを静的ではなくインスタンス変数(属性)にする必要があります。

スレッドを停止する場合は常に、Mapからスレッドを取得し、setKeepRunning(false)を使用して属性keepRunningをfalseに設定します。

于 2012-11-19T20:18:48.817 に答える
1

ここで車輪の再発明をしないでください。Thread.interrupt()を使用し、Thread.isInterrupted()フラグを適切にチェックするか、InterruptedExceptionを適切に処理します。IEはそれを飲み込んだり、printStackTrace()して続行したりしません。InterruptedExceptionを受け取った場合は、Runanble.run()メソッドの境界でそれをキャッチし、外側のループを停止してスレッドをシャットダウンします。

メソッドを次のように変更する必要があります。

public void run() {
   try {
      while( !Thread.currentThread().isInterrupted() ) {
          doSomeThreadedThing();
      }
   } catch( InterruptedException e ) {
      // maybe log some info you are shutting down
   }
}

一部のIOでスタックしない限り、スレッドを適切にシャットダウンするのは非常に簡単です。ロジック内のThread.isInterrupted()を定期的にチェックするのを待ちたくない長時間実行タスクがある場合。Thread.interrupted()を使用する場合に比べて、揮発性ブールフラグメカニズムによって提供される利点はありません。

于 2012-11-19T20:23:02.063 に答える