我们的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()中根本没有阻塞,而是在它之前的某个点。
不管怎么说,都要感谢你的想法。
发布于 2011-03-01 03:10:30
快速搜索Java Bugs数据库没有吐出任何符合你症状的东西。但这是值得你做更广泛的搜索。
但是,值得注意的是,JVM错误只是许多可能的理论中的一种(参见注释),在这个阶段几乎没有证据支持任何理论。如果我是你,我会:
(在最后一个要点上,可能有必要向客户指出显而易见的问题。如果他们想修复这个bug,他们可能需要做一些额外的工作来帮助您跟踪这个bug,比如安装一个“实验性”版本的应用程序。)
https://stackoverflow.com/questions/5149999
复制相似问题