1. 程式人生 > >復習多線程二

復習多線程二

主線程 ima cpu 程序 I/O ava 線程停止 時間 之一

守護線程

java中有兩種線程:一種是主線程,一種是守護線程。

用戶線程是指:用戶自定義創建的線程,主線程停止,用戶線程不會停止。

守護線程:當進程不存在或主線程停止,守護線程也會停止。

使用setDaemon(true)方法設置為守護線程

public class DaemonThread {

	public static void main(String[] args) {
		Thread thread=new Thread(new Runnable(){
			@Override
			public void run() {
				while(true){
					try {
						
						Thread.sleep(100);
						
					} catch (Exception e) {
						
					}
					System.out.println("我是子線程");
				}
			}
		});
		
		thread.setDaemon(true);
		thread.start();
		
		for(int i=0;i<8;i++){
			try {
				Thread.sleep(100);
			} catch (Exception e) {
				
			}
			System.out.println("我是主線程");
		}
		System.out.println("主線程執行完畢!");
	}

}

  技術分享圖片

多線程的運行狀態:

技術分享圖片

線程從創建、運行到結束總是處於下面五個狀態之一:新建狀態、就緒狀態、運行狀態、阻塞狀態、死亡狀態。

新建狀態:

  當用new操作符創建一個線程時,例如new Thread(R),線程還沒有開始運行,此時線程處於新建狀態。當一個線程處於新生狀態時,程序還沒有開始運行線程中的代碼

就緒狀態:

  一個新創建的線程並不自動開始運行,要執行線程,必須調用線程的start()方法。當線程對象調用start()方法即啟動了線程,start()方法創建線程 運行的系統資源,並調度線程運行run方法。

當start()方法返回後,線程就屬於就緒狀態。

  處於就緒狀態的線程並不一定立即運行run()方法,線程還必須同其他線程競爭CPU時間,只有獲取CPU時間才可以運行線程。因為在單核CPU的計算機系統中,不可能同時運行多個線程,一個時刻僅有一個線程處於運行狀態。因此此時可能有多個線程處於就緒狀態。對多個處於就緒狀態的線程是由java運行時系統的線程調度程序(thread scheduler)來調度的。

運行狀態:

  當線程獲得CPU時間後,它才進入運行狀態,真正開始執行run方法。

阻塞狀態:

  線程運行過程中,可能由各種原因進入阻塞狀態:

    1、線程通過調用sleep方法進入睡眠狀態

    2、線程調用一個在I/O上被阻塞的操作,即該操作在輸入輸出完成之前不會返回到它的調用者;

    3、線程視圖得到一個鎖,而該鎖正被其他線程持有。

    4、線程在等待某個觸發條件

死亡狀態:

  有兩個原因會導致線程死亡:

    1、run()方法正常退出而自然死亡,

    2、一個未捕獲的異常終止了run()方法而使線程猝死。

為了確定線程在當前是否存活著(就是要麽是可運行的,要麽是被阻塞了),需要使用

isAlive方法。如果是可運行或被阻塞,這個方法返回true; 如果線程仍舊是new狀態且不是可運行的, 或者線程死亡了,則返回false.

復習多線程二