线程卡在Thread.join()中,即使其他线程已终止

时间:2011-03-01 02:50:50

标签: java multithreading join jvm

我们的Java应用程序启动一个工作线程(使用Thread.start())。此后不久,它在工作线程上调用Thread.join()。工作线程执行一些操作并终止。第一个线程退出对join()的调用并继续它的快乐方式。标准的东西:

Thread t = new WorkerThread();
t.start();

// Blah blah

t.join();

class WorkerThread extends Thread {
    public void run() {
        // Do some stuff
    }
}

至少它应该是如何工作的,以及它在任何我们可以复制的情况下是如何工作的。但是,我们有一位客户一直遇到麻烦。

使用PsiProbe查看线程,他们看到创建了工作线程。它运行一段时间,但一段时间后从线程列表中消失。这发生在意外时间(基于与工作线程相关的其他事件的时间)。主线程永远不会退出join()电话。

这似乎打破了join()的合同,并向我暗示了某种JVM级别的错误。有没有人目睹这样的行为,或者知道是什么原因引起的?

编辑3-3-11:

我还在等待来自客户的确凿数据,但似乎我真的不知道我以为我知道的是什么:主线程可能根本没有在join()中阻塞,而是在在它之前的一点。

感谢所有人的想法,无论如何。

1 个答案:

答案 0 :(得分:0)

快速搜索Java Bugs Database并未发现任何符合您症状的内容。但是,在进行更广泛的搜索时,这是值得的。


然而,值得注意的是,JVM错误只是众多可能的理论中的一个(参见评论),而且在这个阶段几乎没有任何理论证据。如果我是你,我会:

  1. 弄明白客户的平台是什么
  2. 在Java bug数据库中搜索任何看似与观察到的症状相匹配的已知错误(例如它们)。
  3. 如果您发现一个看起来像“点击”的错误,请进一步评估,尝试确认它确实是客户的问题,并查看是否有任何方法可以缓解它。
  4. 另外......
    • 看看其他可能的理论;例如见上文
    • 尝试找出与没有此问题的其他人相比,客户安装的不同之处
    • 添加更多监控,并尝试让客户使用该版本。
  5. (在最后一个要点,可能有必要向客户指出明显的问题。如果他们想要修复错误,他们可能需要做额外的事情来帮助你追踪错误,比如安装运行“实验“应用程序的版本。”