我们的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()
中阻塞,而是在它之前的某个点上。无论如何,感谢大家提供的想法。