我们的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()
中阻塞,而是在在它之前的一点。
感谢所有人的想法,无论如何。
答案 0 :(得分:0)
快速搜索Java Bugs Database并未发现任何符合您症状的内容。但是,在进行更广泛的搜索时,这是值得的。
然而,值得注意的是,JVM错误只是众多可能的理论中的一个(参见评论),而且在这个阶段几乎没有任何理论证据。如果我是你,我会:
(在最后一个要点,可能有必要向客户指出明显的问题。如果他们想要修复错误,他们可能需要做额外的事情来帮助你追踪错误,比如安装运行“实验“应用程序的版本。”