线程不能继续运行

时间:2013-06-05 04:34:25

标签: java

我有以下代码:

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)行添加断点并激活远程调试,则线程继续正常运行到结尾。任何人都可以给我一些建议吗?为什么线程不能继续运行?所有线程都没有任何异常地运行。

1 个答案:

答案 0 :(得分:1)

看起来你在这里有竞争条件,因此执行的结果取决于时间,启用调试等。发布的代码或多或少都很好,错误很可能是在Test2Runnable类中。我想有一些标志(isDone,hasError)有可见性问题。尝试声明它们是不稳定的。 请在这里添加Test2Runnable代码,我将能够提供更准确的答案。