Java 多執行緒基礎(八)執行緒讓步
- 2020 年 6 月 19 日
- 筆記
- Java 多執行緒基礎
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() 方法不會釋放鎖。

