Java守護執行緒注意事項
阿新 • • 發佈:2019-02-13
簡介
在學習多執行緒的時候經常看到守護執行緒,但是之前只是知道他是在主執行緒執行結束之後自動退出,今天看到了它的其他特性,一下做簡單介紹。
示例程式碼
public class DaemonSample {
public static void main(String[] args) throws InterruptedException {
Thread.sleep(1000);
ThreadOne threadOne = new ThreadOne();
threadOne.setDaemon(true);
threadOne.start();
}
}
class ThreadOne extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
}
}
執行結果
一般情況下沒有輸出結果,但這不是肯定的,雖然守護執行緒當中的程式碼邏輯有for迴圈,但是在啟動它的主執行緒當中,當start的時候,主執行緒也剛好結束,因此守護執行緒還沒來得及執行內部程式碼主執行緒就結束了,那麼守護執行緒也就跟著結束。
再看這一段程式碼
public class Threadtest {
public static void main(String[] args) throws InterruptedException {
Thread.sleep(1000);
ThreadOne threadOne = new ThreadOne();
threadOne.setDaemon(true);
threadOne.start();
for (int i = 0; i < 5; i++) {
System.out.print(threadOne.isAlive() + "---");
Thread.currentThread().sleep(1000);
}
}
}
class ThreadOne extends Thread {
@Override
public void run() {
for (int i = 0; i < 15; i++) {
System.out.print(i + "---");
try {
sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
執行結果
根據執行結果可知,守護執行緒中的程式碼邏輯執行完的時候isAlive的結果是false,也就是說,守護執行緒先於主執行緒結束。由此可知,守護執行緒並不是一定在主執行緒結束的時候才會結束,假如守護執行緒程式碼邏輯不是無限迴圈,而且守護執行緒的邏輯在主執行緒之前執行結束,那麼守護執行緒會先於主執行緒結束。
總結
守護執行緒的結束與否有兩個因素。第一:開啟它的執行緒的主執行緒是否結束;第二:守護執行緒本身是否結束。這裡又分為了兩種情況,
第一種:主執行緒結束,守護執行緒內部程式碼邏輯還沒有執行完;此時根據守護執行緒的特性,主執行緒結束時,不管守護執行緒程式碼邏輯是否執行完,守護執行緒立即結束。
第二種:主執行緒還沒有結束,守護執行緒內部程式碼邏輯已經執行完;此時雖然主執行緒仍然存活,但是守護執行緒程式碼邏輯已經結束,因此守護執行緒先於主執行緒結束。