簡體   English   中英

關於java線程生命周期

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

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