Java 线程状态TimedWait。如何调试?

Java 线程状态TimedWait。如何调试?,java,android,multithreading,Java,Android,Multithreading,我的应用程序运行一些复杂的线程,在后台线程中获取地图并绘制它们。有时,如果我在慢速网络上运行应用程序几个小时,我似乎会让它进入一种奇怪的状态,我的所有线程状态都显示为TimedWait或Wait(除了本地线程,如main) 这是什么原因?如何调试它?我完全迷路了,我知道这是一个有点笼统的问题,但如果有人能给我指出正确的方向,我将不胜感激。例如: 如何确定问题的原因 什么问题通常会导致所有线程锁定 有人见过类似的东西吗 谢谢 定时等待只是一个线程,它在某个O/S级别调用上被阻塞,该调用指定了超时,

我的应用程序运行一些复杂的线程,在后台线程中获取地图并绘制它们。有时,如果我在慢速网络上运行应用程序几个小时,我似乎会让它进入一种奇怪的状态,我的所有线程状态都显示为TimedWait或Wait(除了本地线程,如main)

这是什么原因?如何调试它?我完全迷路了,我知道这是一个有点笼统的问题,但如果有人能给我指出正确的方向,我将不胜感激。例如:

  • 如何确定问题的原因
  • 什么问题通常会导致所有线程锁定
  • 有人见过类似的东西吗
  • 谢谢


    定时等待只是一个线程,它在某个O/S级别调用上被阻塞,该调用指定了超时,例如简单等待原语(
    Object.wait()
    )或套接字操作(
    socket read()/write()
    ),线程队列等。对于任何复杂的程序来说,有几个或多个线程队列是很正常的——我有一个应用服务器,它通常有数百个甚至数千个线程

    您的线程可能在非响应连接上进行备份,并且可能根本没有行为异常。可能只是您需要对它们进行编程,以检测并中止空闲连接

    单击您关心的每个线程,并分析它们的堆栈跟踪,了解它们是如何到达那里的

    大多数体面的分析工具(和应用程序容器)都可以选择打印完整的堆栈跟踪,而更现代的工具可以为您进行死锁和活锁分析。与Sun的JDK一起发布的JVisualVM工具可以在网上使用,因为VisualVM可以做到这一点,而且非常有效。大多数体面的分析器也会在堆栈跟踪中显示锁获取(您的,上面的,不在该视图中)


    否则,您将寻找两个或多个线程争用同一个锁或以不同的顺序获取相同的锁。您可能需要通过实际检查源代码并注释堆栈跟踪来手动执行此操作,但如果您的工具没有正确指向冲突线程,您应该能够缩减可能的候选线程。

    它就在底部的堆栈跟踪中。@SoftwareMonkey只突出显示了一个线程。上面的所有线程也都在TimeWait中。我不知道是什么原因造成的。