1. 程式人生 > >Java守護執行緒注意事項

Java守護執行緒注意事項

簡介

在學習多執行緒的時候經常看到守護執行緒,但是之前只是知道他是在主執行緒執行結束之後自動退出,今天看到了它的其他特性,一下做簡單介紹。

示例程式碼

 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,也就是說,守護執行緒先於主執行緒結束。由此可知,守護執行緒並不是一定在主執行緒結束的時候才會結束,假如守護執行緒程式碼邏輯不是無限迴圈,而且守護執行緒的邏輯在主執行緒之前執行結束,那麼守護執行緒會先於主執行緒結束。

總結

守護執行緒的結束與否有兩個因素。第一:開啟它的執行緒的主執行緒是否結束;第二:守護執行緒本身是否結束。這裡又分為了兩種情況,

第一種:主執行緒結束,守護執行緒內部程式碼邏輯還沒有執行完;此時根據守護執行緒的特性,主執行緒結束時,不管守護執行緒程式碼邏輯是否執行完,守護執行緒立即結束。

第二種:主執行緒還沒有結束,守護執行緒內部程式碼邏輯已經執行完;此時雖然主執行緒仍然存活,但是守護執行緒程式碼邏輯已經結束,因此守護執行緒先於主執行緒結束。