本文目錄
一、yield的意思
yield的中文意思是放棄,投降的意思。當前線程調用yield的時候,是告訴虛擬機它願意讓其他的線程搶佔自己的位置或者表明該線程沒有緊急的事要做,但這只是一種暗示,並不能保證一定會發生。
二、yield()的作用
Thread.yield()方法的作用:暫停當前正在執行的線程,並執行其他同等優先級的線程。(可能沒有效果哦)
yield()讓當前正在運行的線程回到可運行狀態,以允許具有相同優先級的其他線程獲得運行的機會。因此,使用yield()的目的是讓具有相同優先級的線程之間能夠適當的輪換執行。但是,實際中無法保證yield()達到讓步的目的,因爲,讓步的線程可能被線程調度程序再次選中。
三、yield()的結論
public class TestYield {
public static void main(String [] args){
MyThread thread1 = new MyThread("thread1");
MyThread thread2 = new MyThread("thread2");
thread1.start();
thread2.start();
}
}
public class MyThread extends Thread{
MyThread(String s){
super(s);
}
@Override
public void run(){
for(int i = 0; i <= 100; i ++){
System.out.println(getName() + ":" + i);
if(("thread1").equals(getName())){
if(i == 0){
yield();
}
}
}
}
}
結論:大多數情況下,yield()將導致線程從運行狀態轉到可運行狀態,但很有可能沒有效果。
四、Java線程優先級
在java的多線程編程中,有可能會用到yield和join。在具體講解yield和join之前,我們先來看看java中線程的優先級。
線程的優先級:
1、在沒有指定線程的優先級的時候,線程都帶有普通的優先級。
2、線程的優先級可以分爲1到10;10代表最高的優先級,1代表最低的優先級,普通優先級是5。
3、優先級最高的線程在運行時給予優先,但不能保證線程啓動後立刻就進入運行狀態。
4、與線程池中等待的線程相比,正在運行的線程擁有更高的優先級。
5、由調度程序來決定執行哪一個線程。
6、用setProperty()來設定用線程的優先級。
7、在線程的start()方法調用之前,應該指定線程的優先級。
五、yield()注意事項
使用yield方法時要注意的幾點內容:
1、yield是一個靜態的本地方法(native)
2、調用yield後,yield告訴當前線程把運行機會交給線程池中有相同優先級的線程。
3、yield不能保證,當前線程迅速從運行狀態切換到就緒狀態。
4、yield只能是將當前線程從運行狀態轉換到就緒狀態,而不能是等待或者阻塞狀態。
六、join()方法
線程實例中的join()方法可以被用來join到線程執行的開始或者其他線程執行的結束,所以直到其他線程運行結束這個線程纔會執行。如果join()方法在線程實例中被調用,當前運行的線程會被堵塞,直到線程實例運行完成。
例如線程a中調用線程b的join方法,這時線程a就會進入阻塞狀態,直到線程b執行完成。這樣就可以使並行的線程串行化的執行。
具體的join()用法請參考:java join()基本用法與說明解釋