繁体   English   中英

调用Thread.getAllStackTraces()时发生挂起

[英]Hang occurring when Thread.getAllStackTraces() is called

我正在运行以下代码以显示程序的运行线程

public void printTasks() {
    System.out.println("get threads start");
    for (Thread thread : Thread.getAllStackTraces().keySet()) {
        //This block filters the non-java threads running
        if (!thread.getThreadGroup().getName().equals("system")) {
            System.out.println("hello");
        }
    }
    System.out.println("get threads end");
}

问题是,有时代码会在打印“获取线程开始”后挂起,我怀疑挂起发生在此行“ Thread.getAllStackTraces()”

注意:我的程序使用线程执行一组任务,因此,它创建了约70个线程,并且挂起是间歇性的,在我称之为此方法的问题中,每6或7次只有1次出现此问题

我的问题是:

  • 这是一个已知的问题?
  • 有没有办法防止这种行为?
  • 有没有更安全的方法来列出正在运行的线程?

编辑:我正在使用Java 1.8,问题发生在Linux OEL和Windows Server中,在两种情况下都是间歇性的,该软件作为独立的桌面应用程序运行

先感谢您

我只是发现了问题所在(至少这是我的假设)。

用于检索正在运行的线程的代码遇到竞争状况。

我的程序正在创建的线程在不断变化,一些启动线程在很短的时间内(1秒或更短)结束

函数Thread.getAllStackTraces()返回线程和堆栈跟踪的HashMap (行a),然后在下一行(行b)中,我试图获取线程的组名

 for (Thread thread : Thread.getAllStackTraces().keySet()) { <--- a
     if (!thread.getThreadGroup().getName().equals("system")) { <--- b

但是线程持续的时间太短,以至于在到达第二行之前它就消失了,因此我最终尝试使用无效键从地图中获取一个值(这是竞争条件)

注意 :如果您以前从未经历过这种情况,则当您尝试读取不存在的HashMap的值时,可能最终会永远等待结果

在尝试读取其属性之前,请确保该线程仍然存在

public void printTasks() {
    System.out.println("get threads start");
    for (Thread thread : Thread.getAllStackTraces().keySet()) {
        //This block filters the non-java threads running
        if (Thread.getAllStackTraces().containsKey(thread) && //<--new line here
            thread.getThreadGroup().getName().equals("system")) {
            System.out.println("hello");
        }
    }
    System.out.println("get threads end");
}

第二种方法是尝试获取getAllStackTraces()内容的快照以读取不可变对象

欢迎有更好的解决方案,希望对您有所帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM