【java】【多執行緒】睡眠/守護/加入/禮讓執行緒,執行緒優先順序(4)

love_Aym發表於2018-04-15

一、休眠執行緒--sleep()

Thread.sleep(毫秒,納秒):控制當前執行緒休眠若干毫秒,遇到就會睡著時間到了就會自動醒來繼續執行

靜態方法:類名.方法呼叫

    注意:1秒= 1000毫秒,1秒 = 1000 * 1000 * 1000=1000000000納秒,因此windows系統對納秒的支援不夠好,因此用毫秒。

  • 若在主執行緒中使用sleep(),則會中斷異常,需丟擲。
  • 若使用Thread或者Runable建立執行緒,因為父類的run方法中沒有出現異常,因此子類裡也不執行出現異常直接丟擲,而是需要自己捕獲進行處理try-catch
new Thread() {
    public void run() {
	for(int i = 0; i < 10; i++) {
		System.out.println(getName() + "...aa");
		try {        
		    Thread.sleep(10);
		} catch (InterruptedException e) {
		    e.printStackTrace();
		    }
		}
	}
}.start();


二、守護執行緒

setDaemon(boolean):設定一個執行緒為守護執行緒, 該執行緒不會單獨執行, 當其他非守護執行緒都執行結束後, 自動退出

解釋:任何一個守護執行緒都是整個JVM中所有非守護執行緒的保姆:

  • 只要當前JVM例項中尚存在任何一個非守護執行緒沒有結束,守護執行緒就全部工作;只有當最後一個非守護執行緒結束時,守護執行緒隨著JVM一同結束工作。
  • Daemon的作用是為其他執行緒的執行提供便利服務,守護執行緒最典型的應用就是 GC (垃圾回收器),它就是一個很稱職的守護者。
Thread t1 = new Thread() {
	public void run() {
		for(int i = 0; i < 50; i++) {
			System.out.println(getName() + "...aaaaaaaaaaaaaaaaaaaaaa");
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
};			
Thread t2 = new Thread() {
	public void run() {
		for(int i = 0; i < 5; i++) {
			System.out.println(getName() + "...bb");
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
};
			
t1.setDaemon(true);	//將t1設定為守護執行緒,只要t2執行完畢,t1就不會再執行		
t1.start();
t2.start();


三、加入執行緒

Thread. join():當前執行緒暫停, 等待指定的執行緒執行結束後, 當前執行緒再繼續 。插隊操作。

注意:匿名內部類在使用所在方法中的區域性變數時,必須用final修飾。

final Thread t1 = new Thread() {
    public void run() {
        for(int i = 0; i < 50; i++) {
		System.out.println(getName() + "...aaaaaaaaaaaaaaaaaaaaaa");
		try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
    }
};		
Thread t2 = new Thread() {
    public void run() {
	for(int i = 0; i < 50; i++) {
	    if(i == 2) {
	        try {
		    //t1.join();		//插隊,加入,當i=2時,t1加入執行緒,等t1全部執行完畢時再返回t2繼續執行
		    t1.join(30);		//加入,有固定的時間,t1執行30毫秒後,返回此處,t1和t2繼續交替執行
	        } catch (InterruptedException e) {					
		    e.printStackTrace();
	        }
            }
	System.out.println(getName() + "...bb");				
	}
    }
};			
t1.start();
t2.start();


四、禮讓執行緒

yield:讓出cpu,理論上是讓出CPU去處理其他執行緒,但是效果特別不明顯


五、設定執行緒的優先順序

* setPriority():設定執行緒的優先順序,1~10, 效果也不是很明顯

    MIN_PRIORITY = 1;   最低優先順序

    NORM_PRIORITY = 5;  預設優先順序

    MAX_PRIORITY = 10;  最高優先順序






相關文章