1. 程式人生 > >java基礎——守護執行緒

java基礎——守護執行緒

守護執行緒

1.守護執行緒和非守護執行緒(使用者執行緒)

Java分為兩種執行緒:使用者執行緒和守護執行緒守護執行緒 是指在程式執行的時候在後臺提供一種通用服務的執行緒,比如垃圾回收執行緒就是一個很稱職的守護者,並且這種執行緒並不屬於程式中不可或缺的部分。因此,當所有的非守護執行緒結束時,程式也就終止了,同時會殺死程序中的所有守護執行緒。反過來說,只要任何非守護執行緒還在執行,程式就不會終止。守護執行緒和使用者執行緒的沒啥本質的區別:唯一的不同之處就在於虛擬機器的離開:如果使用者執行緒已經全部退出執行了,只剩下守護執行緒存在了,虛擬機器也就退出了。 因為沒有了被守護者,守護執行緒也就沒有工作可做了,也就沒有繼續執行程式的必要了。將執行緒轉換為守護執行緒可以通過呼叫Thread物件的setDaemon(true)方法來實現。在使用守護執行緒時需要注意一下幾點:

  • thread.setDaemon(true)必須在thread.start()之前設定,否則會跑出一個IllegalThreadStateException異常。你不能把正在執行的常規執行緒設定為守護執行緒。
  • 在Daemon執行緒中產生的新執行緒也是Daemon的。
  • 守護執行緒應該永遠不去訪問固有資源,如檔案、資料庫,因為它會在任何時候甚至在一個操作的中間發生中斷。
1.非守護執行緒和主執行緒
/**
 * 守護執行緒和非守護執行緒與主執行緒的關係
 * 使用者執行緒是主執行緒建立的,它是非守護執行緒。
 * 守護執行緒和主執行緒一起銷燬
 * @author duqingqing
 * @date 2018年9月24日
 */
public class DaemonThread { public static void main(String[] args) { //thread1是使用者執行緒,是主執行緒建立的 Thread thread1 = new Thread(new Runnable() { @Override public void run() { for(int i=0;i<15;i++) { try { Thread.sleep(300); } catch (Exception e) { // TODO: handle exception
} System.out.println("子執行緒 :"+i); } } }); thread1.start(); //主執行緒 for(int j=0;j<5;j++) { try { Thread.sleep(300); } catch (Exception e) { // TODO: handle exception } System.out.println("主執行緒 :"+j); } System.out.println("主執行緒完畢..."); } }
子執行緒 :0 主執行緒 :0 主執行緒 :1 子執行緒 :1 子執行緒 :2 主執行緒 :2 主執行緒 :3 子執行緒 :3 主執行緒 :4 子執行緒 :4主執行緒完畢...
子執行緒 :5 子執行緒 :6 子執行緒 :7 子執行緒 :8 子執行緒 :9 子執行緒 :10 子執行緒 :11 子執行緒 :12 子執行緒 :13 子執行緒 :14

非守護執行緒不會受主執行緒的影響

2.守護執行緒和主執行緒的關係
/**
 * 守護執行緒和非守護執行緒與主執行緒的關係
 * 使用者執行緒是主執行緒建立的,它是非守護執行緒。
 * 守護執行緒和主執行緒一起銷燬
 * @author duqingqing
 * @date 2018年9月24日
 */
public class DaemonThread {
	public static void main(String[] args) {
		//thread1是使用者執行緒,是主執行緒建立的
		Thread thread1 = new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i=0;i<15;i++)
				{
					try {
						Thread.sleep(300);
					} catch (Exception e) {
						// TODO: handle exception
					}
					System.out.print(" 子執行緒 :"+i);
				}
			}
		});
		thread1.setDaemon(true);//設定為守護執行緒
		thread1.start();
		//主執行緒
		for(int j=0;j<5;j++) {
			try {
				Thread.sleep(300);
			} catch (Exception e) {
				// TODO: handle exception
			}
			System.out.print(" 主執行緒 :"+j);
		}
		System.out.println("主執行緒完畢...");
	}
}

 主執行緒 :0 子執行緒 :0 子執行緒 :1 主執行緒 :1 子執行緒 :2 主執行緒 :2 子執行緒 :3 主執行緒 :3 主執行緒 :4主執行緒完畢...
 子執行緒 :4

主執行緒銷燬,守護執行緒銷燬。