[英]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.