Java多執行緒(六) 執行緒讓步

2021-08-06 05:59:53 字數 1660 閱讀 1827

一、yield()介紹

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

二、yield()示例

下面,通過示例檢視它的用法。

package

com.demo.thread;

public

class thread1 extends

thread

public

synchronized

void

run()} }

}

package

com.demo.thread;

public

class

yieldtest

}

(某一次的)執行結果:

t1 [5]:0t2 [5]:0t1 [5]:1t1 [5]:2t1 [5]:3t1 [5]:4t1 [5]:5t1 [5]:6t1 [5]:7t1 [5]:8t1 [5]:9t2 [5]:1t2 [5]:2t2 [5]:3t2 [5]:4t2 [5]:5t2 [5]:6t2 [5]:7t2 [5]:8t2 [5]:9
結果說明:

「執行緒t1」在能被4整數的時候,並沒有切換到「執行緒t2」。這表明,yield()雖然可以讓執行緒由「執行狀態」進入到「就緒狀態」;但是,它不一定會讓其它執行緒獲取cpu執行權(即,其它執行緒進入到「執行狀態」),即使這個「其它執行緒」與當前呼叫yield()的執行緒具有相同的優先順序。

三、yield() 與 wait()的比較

我們知道,wait()的作用是讓當前執行緒由「執行狀態」進入「等待(阻塞)狀態」的同時,也會釋放同步鎖。而yield()的作用是讓步,它也會讓當前執行緒離開「執行狀態」。它們的區別是:

(01) wait()是讓執行緒由「執行狀態」進入到「等待(阻塞)狀態」,而yield()是讓執行緒由「執行狀態」進入到「就緒狀態」。

(02) wait()是會讓執行緒釋放它所持有物件的同步鎖,而yield()方法不會釋放鎖。

下面通過示例演示yield()是不會釋放鎖的。

package

com.demo.thread;

public

class

yieldlocktest

static

class threada extends

thread

public

void

run() }}

}}

}

(某一次)執行結果:

t1 [5]:0t1 [5]:1t1 [5]:2t1 [5]:3t1 [5]:4t1 [5]:5t1 [5]:6t1 [5]:7t1 [5]:8t1 [5]:9t2 [5]:0t2 [5]:1t2 [5]:2t2 [5]:3t2 [5]:4t2 [5]:5t2 [5]:6t2 [5]:7t2 [5]:8t2 [5]:9
結果說明:

主線程main中啟動了兩個執行緒t1和t2。t1和t2在run()會引用同乙個物件的同步鎖,即synchronized(obj)。在t1執行過程中,雖然它會呼叫thread.yield();但是,t2是不會獲取cpu執行權的。因為,t1並沒有釋放「obj所持有的同步鎖」!

Java多執行緒 執行緒的排程 讓步

執行緒的讓步含義就是使當前執行著執行緒讓出cpu資源,但是扔給誰不知道,僅僅是讓出,執行緒狀態回到可執行狀態。執行緒的讓步使用thread.yield 方法,yield 為靜態方法,功能是暫停當前正在執行的執行緒物件,並執行其他執行緒。package cn.thread 執行緒的排程 讓步 auth...

多執行緒複習 六 執行緒的通訊

一 說明 採用一定的方式,讓執行緒之間進行交流,最終達到控制線程的目的 二 通訊中用到的api 注意 以下為object類的方法 1 wait 語法 物件名.wait 注意 該物件為鎖物件,如果鎖物件為this,實際上可以省略 特點 讓當前執行緒等待,直到其他執行緒呼叫了該鎖物件下的notify或n...

執行緒 六 執行緒池

1.可重用的固定集合執行緒池,以共享的無界佇列的方式來執行這些執行緒 executerservice threadpool executors.newfixedthreadpool 3 容納固定的執行緒 這個執行緒就是建立乙個固定大小的執行緒池,等待任務來的時候就取執行緒池中的執行緒進行任務的執行,...