日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sleep(),wait(),yield(),notify()

發(fā)布時(shí)間:2024/7/19 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sleep(),wait(),yield(),notify() 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

sleep(),wait(),yield() 的區(qū)別

sleep方法和yield方法是Thread類的方法,wait方法是Object的方法。

sleep 方法使當(dāng)前運(yùn)行中的線程睡眼一段時(shí)間,進(jìn)入不可運(yùn)行狀態(tài),這段時(shí)間的長短是由程序設(shè)定的,不會(huì)釋放鎖標(biāo)志。

wait方法調(diào)用后,線程會(huì)放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象調(diào)用notify()方法后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲取對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。

yield 方法使當(dāng)前線程讓出CPU占有權(quán),但讓出的時(shí)間是不可設(shè)定的。yield()也不會(huì)釋放鎖標(biāo)志。

yield()方法對(duì)應(yīng)了如下操作: 先檢測當(dāng)前是否有相同優(yōu)先級(jí)的線程處于同可運(yùn)行狀態(tài),如有,則把 CPU 的占有權(quán)交給此線程,否則繼續(xù)運(yùn)行原來的線程。所以yield()方法稱為"退讓",它把運(yùn)行機(jī)會(huì)讓給了同等優(yōu)先級(jí)的其他線程。

sleep方法允許較低優(yōu)先級(jí)的線程獲得運(yùn)行機(jī)會(huì),但yield()方法執(zhí)行時(shí),當(dāng)前線程仍處在可運(yùn)行狀態(tài),所以不可能讓出較低優(yōu)先級(jí)的線程些時(shí)獲得CPU占有權(quán)。 在一個(gè)運(yùn)行系統(tǒng)中,如果較高優(yōu)先級(jí)的線程沒有調(diào)用 sleep 方法,又沒有受到 I/O阻塞,那么較低優(yōu)先級(jí)線程只能等待所有較高優(yōu)先級(jí)的線程運(yùn)行結(jié)束,才有機(jī)會(huì)運(yùn)行。

yield()只是使當(dāng)前線程重新回到可執(zhí)行狀態(tài),所以執(zhí)行yield()的線程有可能在進(jìn)入到可執(zhí)行狀態(tài)后馬上又被執(zhí)行。所以yield()只能使同優(yōu)先級(jí)的線程有執(zhí)行的機(jī)會(huì)

wait()與notify()的關(guān)系與應(yīng)用

看以下代碼

public class WaitTest {public int flag=10;public static void main(String[] args) {WaitTest wait = new WaitTest();new Thread(new Runnable(){public void run(){wait.method1();}}).start();new Thread(new Runnable(){public void run(){wait.method2();}}).start();}public void method1(){System.out.println("method 1 is running");try{synchronized(this){System.out.println("method 1 is into lock");while(flag>0){this.wait();System.out.println("method 1 get notify");}System.out.println("method 1 is out lock");}}catch(InterruptedException e){e.printStackTrace();}System.out.println("method 1 is end");}public void method2(){System.out.println("method 2 is running");while(flag>0){try{synchronized(this){flag--;this.notify();}Thread.sleep(100);}catch(InterruptedException e){e.printStackTrace();}}System.out.println("method 2 is end");} } 輸出: method 1 is running method 1 is into lock method 2 is running method 1 get notify method 1 get notify method 1 get notify method 1 get notify method 1 get notify method 1 get notify method 1 get notify method 1 get notify method 1 get notify method 1 get notify method 1 is out lock method 1 is end method 2 is end

上例中,線程1執(zhí)行method1先獲取對(duì)象鎖,然后判斷flag的值,如果flag>0,則wait等待,此時(shí)釋放鎖。因此線程2執(zhí)行method2可以獲取對(duì)象鎖,并且每次在鎖內(nèi)執(zhí)行flag--,然后執(zhí)行notify()通知其他線程,接著釋放鎖。線程1獲取notify信號(hào)后,先獲取對(duì)象鎖,然后沿著wait方法繼續(xù)向下執(zhí)行。

wait()方法與notify()必須要與synchronized(resource)一起使用。也就是wait與notify針對(duì)已經(jīng)獲取了resource鎖的線程進(jìn)行操作,從語法角度來說就是Obj.wait(),Obj.notify必須在synchronized(Obj){...}語句塊內(nèi)。從功能上來說wait()線程在獲取對(duì)象鎖后,主動(dòng)釋放CPU控制權(quán),主動(dòng)釋放對(duì)象鎖,同時(shí)本線程休眠。直到有其它線程調(diào)用對(duì)象的notify()喚醒該線程,才能繼續(xù)獲取對(duì)象鎖,并繼續(xù)執(zhí)行。相應(yīng)的notify()就是對(duì)對(duì)象鎖的釋放操作。

【因此,我們可以發(fā)現(xiàn),wait和notify方法均可釋放對(duì)象的鎖,但wait同時(shí)釋放CPU控制權(quán),即它后面的代碼停止執(zhí)行,線程進(jìn)入阻塞狀態(tài),而notify方法不立刻釋放CPU控制權(quán),而是在相應(yīng)的synchronized(){}語句塊執(zhí)行結(jié)束,再自動(dòng)釋放鎖?!?/span>

釋放鎖后,JVM會(huì)在等待resoure的線程中選取一線程,賦予其對(duì)象鎖,喚醒線程,繼續(xù)執(zhí)行。這樣就提供了在線程間同步、喚醒的操作。Thread.sleep()與Object.wait()二者都可以暫停當(dāng)前線程,釋放CPU控制權(quán),主要的區(qū)別在于Object.wait()在釋放CPU同時(shí),釋放了對(duì)象鎖的控制,而在同步塊中的Thread.sleep()方法并不釋放鎖,僅釋放CPU控制權(quán)。

轉(zhuǎn)載于:https://www.cnblogs.com/wuchaodzxx/p/5986765.html

總結(jié)

以上是生活随笔為你收集整理的sleep(),wait(),yield(),notify()的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。