1

私は以下のような次のコードを持っています:

new Thread(new Test1Runnable()).start();     // Line (a)

public class Test1Runnable implements Runnable {  

    public void run() {
       Test2Runnable task1 = new Test2Runnable();
       ExecutorService executor = Executors.newSingleThreadExecutor();

          try {
              executor.submit(task1);

              while(true) {
                  if(task1.isDone()) {
                      break;
                  }
                  // Thread.sleep(2000);   // Line (b)
              }

              if(!task1.hasError()) {   // Line (c)
                  executor.submit(new Test3Runnable());
              }
          } catch(Exception ex) {
              if(executor != null) {
                  executor.shutdown();
              }
          }
    }
}

public class Test2Runnable implements Runnable {

    private Exception error;
    private boolean done;

    public void run() {
        reset();        
        doRun();
        done = true; 
    }

    protected void doRun() {
        try{
           // ...
           // ....
        } catch(Exception ex) {

        }
    }

    private void reset() {
         error = null;
         done = false;        
    }   

    public boolean isDone() {
        return done;
    }

    public boolean hasError() {
       return getError() != null || getNonSuccess() > 0;
    }

    public Exception getError() {
       return error;
    }

}

行 (a) で Test1Runnable を実行し、行 (b) をコメントすると、スレッドがハングして行 (c) まで実行されない場合に問題が発生します。行 (b) のコメントを外すか、行 (c) にブレークポイントを追加してリモート デバッグを有効にすると、スレッドは通常どおり最後まで実行され続けます。誰でもこれについてアドバイスをもらえますか?スレッドが実行を継続しないのはなぜですか? すべてのスレッドは例外なく実行されます。

4

1 に答える 1

1

ここに競合状態があるように見えるので、実行の結果はタイミング、有効なデバッグなどに依存します。投稿されたコードは多かれ少なかれ問題なく、エラーは Test2Runnable クラスにある可能性があります。可視性に問題があるいくつかのフラグ (isDone、hasError) があると思います。それらを揮発性と宣言してみてください。ここに Test2Runnable コードを追加してください。より正確な回答が得られます。

于 2013-06-05T04:53:59.517 に答える