Java有兩種線程分別是用戶線程(UserThread)和守護線程(DaemonThread)
所謂守護線程
是指在程序運行的時候在後台提供一種通用服務的線程
比如垃圾回收線程就是一個很稱職的守護者
並且這種線程並不屬於程序中不可或缺的部分
因此
當所有的非守護線程結束時
程序也就終止了
同時會殺死進程中的所有守護線程
反過來說
只要任何非守護線程還在運行
程序就不會終止
用戶線程和守護線程兩者幾乎沒有區別
唯一的不同之處就在於虛擬機的離開
如果用戶線程已經全部退出運行了
只剩下守護線程存在了
虛擬機也就退出了
因為沒有了被守護者
守護線程也就沒有工作可做了
也就沒有繼續運行程序的必要了
將線程轉換為守護線程可以通過調用Thread對象的setDaemon(true)方法來實現
在使用守護線程時需要注意一下幾點
(
)thread
setDaemon(true)必須在thread
start()之前設置
否則會跑出一個IllegalThreadStateException異常
你不能把正在運行的常規線程設置為守護線程
(
)在Daemon線程中產生的新線程也是Daemon的
(
)守護線程應該永遠不去訪問固有資源
如文件
數據庫
因為它會在任何時候甚至在一個操作的中間發生中斷
代碼示例
import ncurrent
TimeUnit;
/** * 守護線程*/
public class Daemons {
/** * @param args * @throws InterruptedException */
public static void main(String[] args)throws InterruptedException {
Thread d = new Thread(new Daemon())
d
setDaemon(true)
//必須在啟動線程前調用
d
start()
System
out
println(
d
isDaemon()=
+ d
isDaemon()+
)
TimeUnit
SECONDS
sleep(
)
}
class DaemonSpawn implements Runnable { public void run()
{ while (true){ Thread
yield()
} class Daemon implements Runnable {
private Thread[] t = new Thread[
];
public void run()
{ for (int i=
;i<t
length;i++)
{ t[i] = new Thread(new DaemonSpawn())
t[i]
start()
System
out
println(
DaemonSpawn
+ i +
started
)
}
for (int i=
;i<t
length;i++){
System
out
println(
t[
+ i +
]
isDaemon()=
+ t[i]
isDaemon()+
)
}
while (true){ Thread
yield()
}運行結果
d
isDaemon()= true
DaemonSpawn
started
DaemonSpawn
started
DaemonSpawn
started
DaemonSpawn
started
DaemonSpawn
started
DaemonSpawn
started
DaemonSpawn
started
DaemonSpawn
started
DaemonSpawn
started
DaemonSpawn
started
t[
]
isDaemon()= true
t[
]
isDaemon()= true
t[
]
isDaemon()= true
t[
]
isDaemon()= true
t[
]
isDaemon()= true
t[
]
isDaemon()= true
t[
]
isDaemon()= true
t[
]
isDaemon()= true
t[
]
isDaemon()= true
t[
]
isDaemon()= true
以上結果說明了守護線程中產生的新線程也是守護線程
如果將mian函數中的TimeUnit
SECONDS
sleep(
)
注釋掉
運行結果如下
d
isDaemon()= true
DaemonSpawn
started
DaemonSpawn
started
DaemonSpawn
started
DaemonSpawn
started
DaemonSpawn
started
DaemonSpawn
started
DaemonSpawn
started
DaemonSpawn
started
DaemonSpawn
started
DaemonSpawn
started
以上結果說明了如果用戶線程已經全部退出運行了
只剩下守護線程存在了
虛擬機也就退出了
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26210.html