對於Thread來說只想說兩個方法,一個是setDaemon(false|true),另一個是join()。首先說說守護線程,這麼東西是幹什麼用的?對於 Java應用我們都知道main方法是入口,它的運行代表著主線程開始工作了,我們也知道JVM裡面有記憶體回收行程的存在使得我們放心讓main飛 奔,然而這背後的故事是記憶體回收線程作為守護著主線程的守護線程默默的付出著。很像那個啥啊,呵呵。令人髮指的是main這個畜生背後 其實有好幾個守護線程默默的付出!當然如果硬是要把守護線程比做女人,非守護線程比做男人的話,那麼一個男人背後可以有多個默默付 出的女人。Java在設計時就預設了這個現實社會不太能實現的現實,並且強制規定如果男人不在了,這個虛擬世界就over了,看來資本主義 社會下長大的孩子創造的東西骨子裡是封建社會的血脈啊!扯遠了,對的,JVM內部的實現是如果啟動並執行程式只剩下守護線程的話,程式將 終止運行,直接結束。所以守護線程是作為輔助線程存在的,主要的作用是提供計數等等輔助的功能。下面寫個小例子說明一下:
Java代碼
/**
* User: yanxuxin
* Date: Dec 10, 2009
* Time: 7:16:55 PM
*/
public class DaemonSample {
public static void main(String[] args) throws Exception{
DaemonThread t = new DaemonThread();
t.setDaemon(true);//this is set t thread as a daemon thread.
t.start();
Thread.sleep(2000);
System.out.println("main thread exit.");
}
}
class DaemonThread extends Thread {
@Override
public void run() {
for(int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("i=" + i);
}
}
}
這個例子的結果是main主線程睡兩秒之後說再見,而子線程則是在這兩秒內計計數然後跟著一起說再見。當然它很不情願,因為它想計 10秒,但是沒機會。把t.setDaemonThread(true)注釋掉你會看到主線程說再見了,但是子線程快快樂樂的計完數說再見。這就是守護線程 的作用,一切以非守護線程為主!很癡情啊,哈哈。