2013-03-12 100 views
20

我有一個多線程的應用程序,我通過setName()屬性爲每個線程分配一個唯一的名稱。現在,我希望功能可以直接使用相應的名稱訪問線程。獲取主題名稱

出頭像下面的函數:

public Thread getThreadByName(String threadName) { 
    Thread __tmp = null; 

    Set<Thread> threadSet = Thread.getAllStackTraces().keySet(); 
    Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]); 

    for (int i = 0; i < threadArray.length; i++) { 
     if (threadArray[i].getName().equals(threadName)) 
      __tmp = threadArray[i]; 
    } 

    return __tmp; 
} 

上述功能檢查所有正在運行的線程,然後從該組運行的線程返回所需的線程。也許我想要的線程被中斷,那麼上面的函數將不起作用。關於如何整合該功能的任何想法?

+2

如何正在創建的線程? – 2013-03-12 19:17:13

+2

只需按照名稱在'HashMap '中存儲所需的線程。 – millimoose 2013-03-12 19:23:07

+0

@JohnVint在另一個類中創建線程,所以我不能直接訪問它們。 – NullPointer 2013-03-12 19:23:31

回答

17

你可以找到所有活躍線程使用ThreadGroup

  • 讓你的當前線程的組
  • 通過調用ThreadGroup.getParent() UNT您的方式工作的線程組層次如果你發現有一個空父母組。
  • 致電ThreadGroup.enumerate()查找系統上的所有線程。

這樣做的價值完全逃脫了我......你會怎麼做一個命名的線程?除非您在應該執行Runnable(這是一開始就草率編程)的子類Thread

+0

對此的一個用例是找到一個在第三方庫中定義的局部變量線程(意思是反射無法到達它)(這意味着源代碼不能被輕易修改),它具有指定的名稱來設置未捕獲的異常處理程序(因爲當在這裏拋出異常時,它們無法進行日誌記錄)。這是一個非常特殊的情況,但這種情況存在邊緣情況。 – Jyro117 2014-06-07 19:09:53

+0

在我的情況下,我正在使用它來編寫一個單元測試來調試可疑線程安全問題的線程。有問題的線程實現Runnable,但問題是:什麼是替代答案?你如何通過名字獲得特定的Runnable? – 2014-06-10 13:59:26

5

我喜歡HashMap的想法最好,但如果你想保留設置,您可以遍歷集合,而不是通過轉換爲陣列的設置會:

Iterator<Thread> i = threadSet.iterator(); 
while(i.hasNext()) { 
    Thread t = i.next(); 
    if(t.getName().equals(threadName)) return t; 
} 
return null; 
+1

這就像上面的例子,如果線程中斷,它將不起作用! – NullPointer 2013-03-12 19:39:01

12

皮特的回答迭代..

public Thread getThreadByName(String threadName) { 
    for (Thread t : Thread.getAllStackTraces().keySet()) { 
     if (t.getName().equals(threadName)) return t; 
    } 
    return null; 
} 
+0

可能是很多線程。 – 2018-03-02 07:29:44