这个问题出现在我正在开发的分布式多线程应用程序中,其中线程似乎在分布式任务执行期间随机返回。假设此应用程序中的每个线程使用与下面的块相同的基本代码:
public class ExecutionThread extends Thread{
@Override
public void run(){
while(true){
try{
//task submitter app dumps all Tasks in to a queue. We retrieve
//those tasks here one-by-one and run them:
Task t = priorityBlockingQueue.take();
//execute is abstract, so it could potentially do anything here:
t.execute();
} catch(Throwable e){
//task submitter app will be able to access the Throwable later:
t.setUncaughtThrowable(e);
}
}
}
}
我应该注意到Task类是抽象的而且非常简单 - 它只有抽象的execute()方法,所以我觉得没有必要在这里发布代码。
我知道在JVM中可能会发生一些疯狂的事情,但这个代码对我来说似乎是相当无懈可击的,因为线程永远不会返回,除非它运行的JVM死掉。实际上,我们看到线程仍然返回而没有各自的JVM死亡并且无法确定原因。更糟糕的是,我们无法看到这些线程的控制台,因为它们是作为远程计算机上的子进程生成的。我们已经尝试记录throwable,但没有任何内容打印到文件。关于什么可能导致这个线程返回的任何想法?
答案 0 :(得分:4)
Exception
子句中必须有catch
。