Java 多執行緒基礎(八)執行緒讓步 yield
一、yield 介紹
yield()的作用是讓步。它能讓當前執行緒由“執行狀態”進入到“就緒狀態”,從而讓其它具有相同優先順序的等待執行緒獲取執行權;但是,並不能保證在當前執行緒呼叫yield()之後,其它具有相同優先順序的執行緒就一定能獲得執行權;也有可能是當前執行緒又進入到“執行狀態”繼續執行。
二、yield 示例
public class YieldTest { private static Object obj = new Object(); public static void main(String[] args) { Thread t1 = new MyThread("t1"); Thread t2 = new MyThread("t2"); t1.start(); t2.start(); } static class MyThread extends Thread{ public MyThread(String name) { super(name); } public synchronized void run() { try { for(int i = 0;i < 5;i++) { System.out.println(Thread.currentThread().getName() + "--" + this.getPriority() + "--"+ i); if(i % 4 == 0) Thread.yield(); } }catch(Exception e) { e.printStackTrace(); } } } }
// 執行結果(每次執行結果可能不同)
t1--5--0
t1--5--1
t2--5--0
t1--5--2
t1--5--3
t1--5--4
t2--5--1
t2--5--2
t2--5--3
t2--5--4
說明:
“執行緒t1”在能被4整數的時候,並沒有切換到“執行緒t2”。這表明,yield()雖然可以讓執行緒由“執行狀態”進入到“就緒狀態”;但是,它不一定會讓其它執行緒獲取CPU執行權(即,其它執行緒進入到“執行狀態”),即使這個“其它執行緒”與當前呼叫yield()的執行緒具有相同的優先順序。
三、yield() 與 wait()
我們知道,wait() 的作用是讓當前執行緒由“執行狀態”進入“等待(阻塞)狀態”的同時,也會釋放同步鎖。而 yield() 的作用是讓步,它也會讓當前執行緒離開“執行狀態”。它們的區別是:
①、wait()是讓執行緒由“執行狀態”進入到“等待(阻塞)狀態”,而 yield() 是讓執行緒由“執行狀態”進入到“就緒狀態”。
②、wait() 是會執行緒釋放它所持有物件的同步鎖,而 yield() 方法不會釋放鎖。