在Java中等待同步方法的线程是否有默认超时?我的应用程序中的某些线程未按预期完成。无论如何检查线程是否因超时而死亡?在Java中等待同步方法的线程是否有超时?
回答
如果某个方法正在等待同步对象,它应该永远不会死亡,但如果出现错误,它可能会等待很长时间(如在“永远”中)。也许你的程序永远不会释放对资源的锁定?
JLS没有为部分指定任何超时。它只是提到
虽然执行的线程拥有 锁,没有其他线程可以获取 锁。
您可以在join()方法上设置超时以确保您不会永远等待。
我会看看java.util.concurrent包,看看是否添加了新的功能来帮助你的情况。
我还推荐Brian Goetz的“Java Concurrency In Practice”。 (我需要自己重新读一遍。)
好点:还值得注意的是,术语“死锁”意味着两个线程正在等待对方。如果发生超时,“死锁”这个词就不存在了。 – Pindatjuh 2010-03-14 15:38:06
duffymo - 如果一个线程启动另一个线程,第二个线程不得不向第一个线程报告进度,但第一个线程在第二个线程完成之前死亡,那么您会期望发生什么? – MalcomTucker 2010-03-14 16:15:12
我不知道。这听起来像是需要双向沟通,但事实并非如此。你需要在这里回调。这就是为什么我建议超越原始java.lang.Thread并查看java.util.concurrent包,因为有可能适用的新功能。 – duffymo 2010-03-14 16:32:10
Java中的线程不会突然死掉。或者它们没有进展(在一个锁或者无限循环或者类似的环境中被阻塞),或者如果一个异常被抛出并且没有被处理,那么当异常传播到顶层时它将停止执行(然后应该打印异常堆栈跟踪到System.err)。
如果您的应用程序死锁,找出原因的一种方法是进行线程转储。 JVM也可以自己检测简单的死锁,在这种情况下,它会在线程转储中报告它们。
您可以在Linux下通过在控制台窗口中运行kill -QUIT <pid>
和Windows下的命令Ctrl + Break
来生成线程转储。甚至更简单,请使用VisualVM,StackTrace或类似的工具。
我建议你使用kill -3来查看线程转储,然后查看有问题的线程是什么。
- 1. 等待同步异步方法在同一线程上完成
- 2. 线程等待/异步有多不同?
- 3. 同步一个方法不同的Sidekiq线程并等待
- 4. 等待/异步 - 异步方法在主线程中运行
- 5. 等待vs无等待同步方法(java)
- 6. XmlPullParser同步:线程正在等待
- 7. java线程睡眠解决方案和等待同步块
- 8. 方法超时而不是等待
- 9. java - 从等待里面同步调用同步方法
- 10. 异步等待超时
- 11. C#线程同步(等待执行)
- 12. 如何在一个线程中等待异步方法?
- 13. 同步方法,而使用的等待()
- 14. java等待池中的所有线程
- 15. 等待一个同步方法,其中调用异步方法
- 16. 忽略CasperJS中的等待步超时
- 17. 等待不释放异步方法中的调用线程
- 18. Java侦听器在同步期间是否等待或丢弃?
- 19. 异步/等待与线程
- 20. 多线程:阻塞等待超时
- 21. 方法上的Java线程同步
- 22. 线程是否在锁FIFO上等待?
- 23. 是否与调用者在同一个线程中运行异步/等待方法?
- 24. C#同步等待/轮询方法
- 25. 角2等待同步方法
- 26. 异步/等待只有多线程?
- 27. 同步方法是否在UI线程(Android)的不同线程上运行?
- 28. 是否有可能要等待所有的线程在JMeter的
- 29. 裹同步方法成一个异步一个可“等待”时
- 30. 在java中的线程等待
谢谢,我不认为*有任何死锁,但这可能是原因.. – MalcomTucker 2010-03-14 15:34:20