我有以下代码:
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)行添加断点并激活远程调试,则线程继续正常运行到结尾。任何人都可以给我一些建议吗?为什么线程不能继续运行?所有线程都没有任何异常地运行。
答案 0 :(得分:1)
看起来你在这里有竞争条件,因此执行的结果取决于时间,启用调试等。发布的代码或多或少都很好,错误很可能是在Test2Runnable类中。我想有一些标志(isDone,hasError)有可见性问题。尝试声明它们是不稳定的。 请在这里添加Test2Runnable代码,我将能够提供更准确的答案。