1. 程式人生 > >java多執行緒:4、Java對多執行緒的支援(二)後臺執行緒setDaemon、暫停執行緒yield

java多執行緒:4、Java對多執行緒的支援(二)後臺執行緒setDaemon、暫停執行緒yield

文章目錄

一、設定後臺執行緒

二、yield方法,暫停執行緒讓別的執行緒執行


上篇文章介紹了執行緒實現方式、執行緒的隨機性,大家如需瞭解可參考 java多執行緒:3、Java對多執行緒的支援(一)執行緒實現方式、執行緒的隨機性 這篇我們來看看後臺執行緒setDaemon、暫停執行緒yield

一、設定後臺執行緒

t03_設定後臺執行緒

MultiThread類

public class MultiThread {
	public static void main(String[] args) {
		MyThread mt = new MyThread();
		mt.setDaemon(true);//線上程啟動之前,標記為後臺執行緒
		mt.start();
		
		int index = 0;
		while(true){
			
			if(index++ == 500)
					break;//跳出迴圈
				System.out.println("main:"+Thread.currentThread().getName());
				
		}
		
	}
}

Main方法所在的執行緒是一個非後臺的執行緒

mt.setDaemon(true);//在mt執行緒啟動之前,標記為後臺執行緒

然後啟動:mt.start();

 

MyThread類

public class MyThread extends Thread {
	@Override
	public void run() {
		while(true)
		System.out.println(getName());
	}
}

 

列印結果

我們看一下當main方法所在的執行緒退出的時候,那麼我們這個後臺執行緒是否也跟著退出?

剛開始的時候是main方法所線上程和後臺執行緒mt在交替執行,

當我們main方法所線上程終止的時候,那麼這個後臺執行緒mt也就跟著在後面終止了,不再迴圈執行啦!

 

二、yield方法,暫停執行緒讓別的執行緒執行

一個正在執行的執行緒可以放棄它執行的權利,讓另外一個執行緒開始執行,我們可以使用方法yield方法。

t04_yield方法暫停執行緒讓別的執行緒執行

MultiThread類

public class MultiThread {
	public static void main(String[] args) {
		MyThread mt = new MyThread();
		mt.setDaemon(true);//線上程啟動之前,標記為後臺執行緒
		mt.start();
		
		int index = 0;
		while(true){
			
			if(index++ == 500 )
					break;
			
				System.out.println("main:"+Thread.currentThread().getName());
				
		}
		
	}
	
}

MyThread類

public class MyThread extends Thread {
	@Override
	public void run() {
		
		while(true){
			System.out.println(getName());
			yield();//暫停當前執行緒,讓其他執行緒執行
		} 
		
	}
}

這裡就不截圖了我們列印輸出以後,可以看到每當我們列印mt執行緒名以後,因為呼叫了yield方法,讓當前執行緒暫停了,

於是執行緒發生切換,輪到main方法所在的執行緒開始執行,當main方法所線上程執行到一段時間之後,

執行緒又切換到mt執行緒,當列印mt執行緒名以後,因為呼叫了yield方法,讓當前執行緒暫停了,

執行緒又切換到main方法所線上程......

 

       Java執行緒中的Thread.yield( )方法,譯為執行緒讓步。顧名思義,就是說當一個執行緒使用了這個方法之後,它就會把自己CPU執行的時間讓掉,讓自己或者其它的執行緒執行,注意是讓自己或者其他執行緒執行,並不是單純的讓給其他執行緒。

       yield()的作用是讓步。它能讓當前執行緒由“執行狀態”進入到“就緒狀態”,從而讓其它具有相同優先順序的等待執行緒獲取執行權;但是,並不能保證在當前執行緒呼叫yield()之後,其它具有相同優先順序的執行緒就一定能獲得執行權;也有可能是當前執行緒又進入到“執行狀態”繼續執行!

      舉個例子:一幫朋友在排隊上公交車,輪到Yield的時候,他突然說:我不想先上去了,咱們大家來競賽上公交車。然後所有人就一塊衝向公交車,有可能是其他人先上車了,也有可能是Yield先上車了。

     但是執行緒是有優先順序的,優先順序越高的人,就一定能第一個上車嗎?這是不一定的,優先順序高的人僅僅只是第一個上車的概率大了一點而已,最終第一個上車的,也有可能是優先順序最低的人。並且所謂的優先順序執行,是在大量執行次數中才能體現出來的。 參考連結:https://www.cnblogs.com/java-spring/p/8309931.html