簡體   English   中英

給定其ThreadInfo對象的我該如何中斷線程?

[英]How do I interrupt() a thread given its ThreadInfo object?

在這種情況下,我需要在應用程序運行時進行一些線程清理。 (這又主要是由於庫設計的選擇,不幸的是,這是我無法控制的。)

我無權訪問任何相關的java.lang.Thread實例,因為該線程是在代碼控制范圍之外創建的。 這意味着在Java線程原始棄用如何停止線程以及如何中斷從方法內部創建的線程時建議的簡單方法? 並沒有真正幫助我,因為它們都依賴於可用或可能可用的Thread實例。

但是,我確實有(全新的)代碼調用ThreadMXBean.dumpAllThreads() ,該代碼返回ThreadInfo []。 這看起來是清理的一個很好的起點,因為返回的數組為我提供了確定哪些特定線程(如果有)需要清除的所有信息。

據我了解,我想做的就是調用Thread.interrupt() 例如,請參見如何精確地中斷線程? 問題在於,僅給定ThreadInfo對象,我似乎找不到任何方法。

綜上所述,我准備提出問題:

如何從ThreadInfo對象到對應的Thread對象,以便可以在Thread對象實例上調用方法?

另外, 僅給一個描述線程的ThreadInfo對象,在有效調用線程上的Thread.interrupt()的其他方法是什么?

建議的解決方案理想情況下應與Java 7和Java 8一起使用。它們需要與Java 8一起使用。

有什么建議嗎?

在ThreadInfo中,您具有線程ID,因此可以使用它獲取對線程的引用。

閱讀這個問題,如何做到這一點。

我會做這樣的事情:

ThreadInfo[] threadInfos = ....;
Set<Long> tIds = new HashSet<>();
for (ThreadInfo tIndo : threadInfos) {
  tIds.add(tIndo.getId());
}
for (Thread t : Thread.getAllStackTraces().keySet()) {
  if(tIds.contains(t.getId()) {
    t.interrupt();
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM