我正在开发一个分布式多线程应用程序,其中线程在分布式任务执行过程中似乎会随机返回。假设该应用程序中的每个线程都使用与下面代码块相同的基本代码:
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,但没有任何东西被打印到文件中。你有什么想法,可能会导致这个线程仍然返回吗?
t
无法解析为一种类型。 - John Vint