簡體   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