[英]about java thread lifetime
所以我有一個“棘手”的問題,我想看看人們的意見。
我正在編寫一個組件,它擴展了一個 JPanel 並做一些自定義的事情。 在該組件內,我有一個線程,它永遠循環如下:
//chat thread
Thread chat_thread = new Thread(new Runnable(){
public void run(){
while(true){
//get chat updates
}
}
});
chat_thread.start();
那么問題來了,當組件通過remove()
方法從其父組件中移除時,這個線程是否還活着,或者當你移除組件時它會死嗎?
編輯:
感謝大家的回復,確實該線程並沒有終止刪除它的啟動器,所以為了從另一個組件終止這個線程,我做了以下事情:
Set<Thread> t = Thread.getAllStackTraces().keySet();
Iterator it = t.iterator();
while(it.hasNext()){
Thread t2 = (Thread)it.next();
if(t2.getName().equals("chat_thread")){
t2.interrupt();
}
}
首先使用 Thread.setName() 方法為我的線程創建一個名稱。 謝謝!
這個線程永遠不會死(除非它崩潰或終止自己)。
啟動它的線程或包含它的組件發生了什么無關緊要。
如果不想掛起JVM,可以將其聲明為守護線程。 然后它會在其他一切正常時關閉。 為了獲得更多控制,您需要確保在適當的時間終止您自己代碼中的線程。
它仍然會活着。 一個正在運行的線程構成了 GC 的根。 從根開始的引用鏈可訪問的所有內容都不符合 GC 的條件。 這意味着,順便說一句,您的面板也不會被 GC,因為該線程持有對面板的隱式引用( EnclosingPanel.this
)。
當您不想再運行該線程時,您需要確保停止該線程。
線程在完成其工作或您interrupt
它之前不會死亡。
線程在退出 run() 方法時將終止,因此當組件通過 remove() 方法從其父組件中刪除時,線程將永遠不會終止。
看看 Component.removeNotify。 在您的組件中,保留一個指向線程的指針:
public class MyPanel extends JPanel {
private Thread thread = ...;
public void removeNotify() {
super.removeNotify();
thread.interrupt();
}
}
當 awt 決定刪除組件的本機對等方(即支持 awt 組件的 windows 或 linux 組件)時,該方法會被 awt 自身調用。 根據javadoc:
通過破壞本機屏幕資源使該組件無法顯示。 該方法由工具包內部調用,不應由程序直接調用。 覆蓋此方法的代碼應調用 super.removeNotify 作為覆蓋方法的第一行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.