什么条件可能导致Java Thread意外返回?

时间:2012-02-13 18:30:31

标签: java multithreading distributed

这个问题出现在我正在开发的分布式多线程应用程序中,其中线程似乎在分布式任务执行期间随机返回。假设此应用程序中的每个线程使用与下面的块相同的基本代码:

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,但没有任何内容打印到文件。关于什么可能导致这个线程返回的任何想法?

1 个答案:

答案 0 :(得分:4)

Exception子句中必须有catch