java多執行緒:4、Java對多執行緒的支援(二)後臺執行緒setDaemon、暫停執行緒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