(轉)Thread.setDaemon設定說明

來源:互聯網
上載者:User

標籤:

  本想搜下python多線程裡的setDaemon,發現了這篇文章寫得很不錯:http://blog.csdn.net/m13666368773/article/details/7245570

 

Thread.setDaemon的用法,經過學習以後瞭解:

1. setDaemon需要在start方法調用之前使用

2. 線程劃分為使用者線程和後台(daemon)進程,setDaemon將線程設定為後台進程

3. 如果jvm中都是後台進程,當前jvm將exit。(隨之而來的,所有的一切煙消雲散,包括後台線程啦)

4. 主線程結束後,

      1) 使用者線程將會繼續運行

      2) 如果沒有使用者線程,都是後台進程的話,那麼jvm結束

 

另外:

setDaemon方法把java的線程設定為守護線程,此方法的調用必須線上程啟動之前執行。只有在當前jvm中所有的線程都為守護線程時,jvm才會退出。
如果建立的線程沒有顯示調用此方法,這預設為使用者線程。

執行個體如下:

package com.jack.mySample;   
  
import java.io.IOException;   
  
public class TestThread extends Thread {   
       
    public TestThread() {   
    }   
    /** *//**  
     * 線程的run方法,它將和其他線程同時運行  
     */  
    public void run(){   
        for(int i = 1; i <= 100; i++){   
            try{   
                Thread.sleep(100);   
                   
            } catch (InterruptedException ex){   
                ex.printStackTrace();   
            }   
            System.out.println(i);   
        }   
    }   
    public static void main(String [] args){   
        TestThread test = new TestThread();   
        // 如果不設定daemon,那麼線程將輸出100後才結束   
        test.setDaemon(true);   
        test.start();   
        System.out.println("isDaemon = " + test.isDaemon());   
        try {   
            System.in.read(); // 接受輸入,使程式在此停頓,一旦接收到使用者輸入,main線程結束,守護線程自動結束   
        } catch (IOException ex) {   
            ex.printStackTrace();   
        }   
    }   

 

補充說明:

定義:守護線程--也稱“服務線程”,在沒有使用者線程可服務時會自動離開。

優先順序:守護線程的優先順序比較低,用於為系統中的其它對象和線程提供服務。

設定:通過setDaemon(true)來設定線程為“守護線程”;將一個使用者線程設定為

      守護線程的方式是在 線程對象建立 之前 用線程對象的setDaemon方法。

example: 記憶體回收線程就是一個經典的守護線程,當我們的程式中不再有任何啟動並執行

      Thread,程式就不會再產生垃圾,記憶體回收行程也就無事可做,所以當記憶體回收線程是

      JVM上僅剩的線程時,記憶體回收線程會自動離開。它始終在低層級的狀態中運行,用於

      即時監控和管理系統中的可回收資源。

生命週期:守護進程(Daemon)是運行在背景一種特殊進程。它獨立於控制終端並且

      周期性地執行某種任務或等待處理某些發生的事件。也就是

      說守護線程不依賴於終端,但是依賴於系統,與系統“同生共死”。那Java的守護線程是

      什麼樣子的呢。當JVM中所有的線程都是守護線程的時候,JVM就可以退出了;如果還有一個

      或以上的非守護線程則JVM不會退出。

 

 

初次碰到這個方法,就被這個怪裡怪氣的拼字單詞懵了下,查API又覺得理解得不深刻,那還是查下Daemon這個詞有什麼意思,什麼詞源吧。Daemon 中的 ae 為一個音,重音在 /di:/ 上,好象是指希臘守護神的意思吧。在電腦專業英語中是守護線程的意思。原以為如果一個線程被光榮地定義為守護線程,一定會直到進程運行到最後一刻,但真錯了,如果一個線程是守護線程,那麼,主線程運行結束時,如果沒有任何非守護線程在運行,守護線程就會自盡了。 setDaemon方法是Thread中的方法,預設為false狀態,將該線程標記為守護線程或使用者線程,該方法必須在啟動線程前調用,具有最低的優先順序,讓系統資源優先調用其他線程。當正在啟動並執行線程都是守護線程時,JAVA 虛擬機器退出。


如下邊這個小程式如示:

import java.io.IOException;

class TestMain4 extends Thread {
   public void run() {            //永真迴圈線程
       for(int i=0;;i++){
           try {
               Thread.sleep(1000);
           } catch (InterruptedException ex) {   }
           System.out.println(i);
       }
   }

   public static void main(String [] args){
      TestMain4 test = new TestMain4();
      test.setDaemon(true);    //調試時可以設定為false,那麼這個程式是個死迴圈,沒有允出準則。設定為true,即可主線程結束,test線程也結束。
       test.start();
       System.out.println("isDaemon = " + test.isDaemon());
       try {
           System.in.read();   // 接受輸入,使程式在此停頓,一旦接收到使用者輸入,main線程結束,守護線程自動結束
       } catch (IOException ex) {}
   }
}

 

(轉)Thread.setDaemon設定說明

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.