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