【问题标题】:how to detect if another java thread is suspended or frozen?如何检测另一个java线程是否被挂起或冻结?
【发布时间】:2015-02-19 23:12:41
【问题描述】:

我搜索并找到了通过添加布尔值来确定另一个线程是否被挂起的方法。但是,我不想(不想)修改其他线程的代码。而且,我需要检测它是否因任何原因被冻结(甚至是一个错误,所以在这种情况下,其他线程也可能没有响应)。

我看到 eclipse 是如何做到的,并显示应用程序的线程没有响应,我想知道他们是如何编码的。

动机:我需要这个从 3D lwjgl 应用程序中释放鼠标(取消抓取它),这必须独立于任何 IDE,应用程序本身必须这样做。我正在尝试监视主应用程序线程。

【问题讨论】:

    标签: java multithreading 3d mouse


    【解决方案1】:

    虽然不一定是最好的主意,但您可以使用Thread#getState() 查看线程的当前状态。

    但是,这将取决于线程的上下文。如果它因为无法跳出循环而被冻结,则此方法无法工作。此外,如果它只是在等待锁或有界集合,这将是一个错误的调用。

    线程应处于这 3 种状态:BLOCKEDWAITINGTIMED_WAITING

    【讨论】:

    • 哦,我的意思是我需要知道另一个线程状态;不是当前的;现在我明白了 -1 我得到了 sry.. 编辑..
    • 我想我可以,必须检查,但这意味着我可以像你指出的那样简单地检查它的状态?
    • 是的,请注意,如果线程处于等待锁定或有界集合的那些状态,您仍然可能会收到错误警报。
    • 至少在linux上,我们可以在命令行上看到线程活动(cpu使用情况),如果我能找到线程的pid并通过exec()检查它是否有cpu使用情况,它可以工作我也猜
    • 但是......我也只是想,如果该线程定期修改一些可访问的变量或生成某种输出,监视其中任何一个也可能是确定何时取消鼠标的一个很好的猜测
    【解决方案2】:

    在 powershell 或命令提示符下,您可以使用 JPS 列出当前正在运行的所有 java 线程。然后使用 jstack "pid" .. 这将列出在该线程下运行的所有线程。他们的状态也会写在他们旁边。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      相关资源
      最近更新 更多