2010-03-14 22 views

回答

0

如果某个方法正在等待同步对象,它应该永远不会死亡,但如果出现错误,它可能会等待很长时间(如在“永远”中)。也许你的程序永远不会释放对资源的锁定?

+0

谢谢,我不认为*有任何死锁,但这可能是原因.. – MalcomTucker 2010-03-14 15:34:20

4

JLS没有为​​部分指定任何超时。它只是提到

虽然执行的线程拥有 锁,没有其他线程可以获取 锁。

4

您可以在join()方法上设置超时以确保您不会永远等待。

我会看看java.util.concurrent包,看看是否添加了新的功能来帮助你的情况。

我还推荐Brian Goetz的“Java Concurrency In Practice”。 (我需要自己重新读一遍。)

+1

好点:还值得注意的是,术语“死锁”意味着两个线程正在等待对方。如果发生超时,“死锁”这个词就不存在了。 – Pindatjuh 2010-03-14 15:38:06

+0

duffymo - 如果一个线程启动另一个线程,第二个线程不得不向第一个线程报告进度,但第一个线程在第二个线程完成之前死亡,那么您会期望发生什么? – MalcomTucker 2010-03-14 16:15:12

+0

我不知道。这听起来像是需要双向沟通,但事实并非如此。你需要在这里回调。这就是为什么我建议超越原始java.lang.Thread并查看java.util.concurrent包,因为有可能适用的新功能。 – duffymo 2010-03-14 16:32:10

0

Java中的线程不会突然死掉。或者它们没有进展(在一个锁或者无限循环或者类似的环境中被阻塞),或者如果一个异常被抛出并且没有被处理,那么当异常传播到顶层时它将停止执行(然后应该打印异常堆栈跟踪到System.err)。

如果您的应用程序死锁,找出原因的一种方法是进行线程转储。 JVM也可以自己检测简单的死锁,在这种情况下,它会在线程转储中报告它们。

您可以在Linux下通过在控制台窗口中运行kill -QUIT <pid>和Windows下的命令Ctrl + Break来生成线程转储。甚至更简单,请使用VisualVM,StackTrace或类似的工具。

0

我建议你使用kill -3来查看线程转储,然后查看有问题的线程是什么。