Thread-方法以及wait、notify简介
?
Thread.sleep()
1.靜態方法是定義在Thread類中。
2.Thread.sleep()方法用來暫停當前執行的線程,將CPU使用權釋放給線程調度器,但不釋放鎖(也就是說如果有synchronized同步快,其他線程仍然不能訪問共享數據),進入sleeping狀態
的線程不能被notify方法喚醒。在自動蘇醒(超過指定的毫秒數)之后不保證能獲取到CPU,它會先進入就緒態,與其他線程(不分高低優先級)競爭CPU。有兩個sleep方法,一個只有一個毫
秒參數,另一個有毫秒和納秒兩個參數。如果其他的線程中斷了一個休眠的線程,sleep方法會拋出Interrupted Exception。sleep是幫助其他線程獲得運行機會的最好方法,但不會讓出鎖。
Thread.yield()
1.靜態方法是定義在Thread類中。
2.yield方法會臨時暫停當前正在執行的線程,來讓有同樣優先級的正在等待的線程有機會執行。如果沒有正在等待的線程,或者所有正在等待的線程的優先級都比較低,那么該線程會繼續運
行(只能使同優先級的線程有執行的機會)。執行了yield方法的線程什么時候會繼續運行由線程調度器來決定,不同的廠商可能有不同的行為。yield方法不保證當前的線程會暫?;蛘咄V?
,但是可以保證當前線程在調用yield方法時會放棄CPU和鎖。
join()實例方法
1.join()方法使調用該方法的線程在此之前執行完畢,也就是等待該方法的線程執行完畢后再往下繼續執行。注意該方法也需要捕捉異常。
wait
1.定義在Object類中的非靜態方法。
2.用于線程間通信的,會釋放cpu和鎖。應在同步環境中調用。能夠被notify和notifyAll喚醒。
3.void wait() 在其他線程調用此對象的 notify() 方法或者 notifyAll()方法前,導致當前線程等待。
void wait(long timeout)在其他線程調用此對象的notify() 方法 或者 notifyAll()
方法,或者超過指定的時間量前,導致當前線程等待。
wait()后,線程會釋放掉它所占有的“鎖標志”,從而使線程所在對象中的其他shnchronized數據可被別的線程使用。
wait()h和notify()因為會對對象的“鎖標志”進行操作,所以他們必需在Synchronized函數或者 synchronized block 中進行調用。如果在non-synchronized 函數或 non-synchronized
block 中進行調用,雖然能編譯通過,但在運行時會發生IllegalMonitorStateException的異常。
關鍵字synchronized
該關鍵字用于保護共享數據,當然前提條件是要分清哪些數據是共享數據。每個對象都有一個鎖標志,當一個線程訪問到該對象,被Synchronized修飾的數據將被"上鎖",阻止其他線程訪問
。當前線程訪問完這部分數據后釋放鎖標志,其他線程就可以訪問了。
?有一個易錯的地方,當調用t.sleep()的時候,會暫停線程t。這是不對的,因為Thread.sleep是一個靜態方法,它會使當前線程而不是線程t進入休眠狀態。例如有兩個線程同時執行(沒有synchronized)一個線程優先級為MAX_PRIORITY,另一個為MIN_PRIORITY,如果沒有Sleep()方法,只有高優先級的線程執行完畢后,低優先級的線程才能夠執行?;但是高優先級的線程sleep(500)后,低優先級就有機會執行了。
線程優先級低并不意味著得不到處理器執行,而只是執行的頻率低一點而已。而且線程的優先級一般不用我們程序員去主動設置,所以這兩個方法對我們來說基本沒啥用哈哈~。
在一個運行系統中,如果較高優先級的線程沒有調用sleep方法,也沒有受到I/O阻塞,那么較低優先級線程只能等待所有較高優先級的線程運行結束,方可有機會運行。
wait()和notify()、notifyAll() 這三個方法都是java.lang.Object的方法。
這三個方法用于協調多個線程對共享數據的存取,所以必須在synchronized語句塊內使用。synchronized關鍵字用于保護共享數據,阻止其他線程對共享數據的存取,但是這樣程序的流程就
很不靈活了,如何才能在當前線程還沒退出synchronized數據塊時讓其他線程也有機會訪問共享數據呢?此時就用這三個方法來靈活控制。
wait()方法使當前線程暫停執行并釋放對象鎖標示
,讓其他線程可以進入synchronized數據塊,當前線程被放入對象等待池中。當調用notify()方法后,將從對象的等待池中移走一個任意的線程并放到鎖標志等待池中,只有鎖標志等待池中
線程能夠獲取鎖標志;如果鎖標志等待池中沒有線程,則notify()不起作用。
notifyAll()則從對象等待池中移走所有等待那個對象的線程并放到鎖標志等待池中。
?以下是wait和sleep的區別
-
wait是Object的成員方法,而sleep是Thread的靜態方法。
-
調用wait方法需要先獲得鎖,而調用sleep方法是不需要的。
-
調用wait方法的線程需要用notify來喚醒,而sleep必須設置超時值。
-
線程在調用wait方法之后會先釋放鎖,而sleep不會釋放鎖。
轉載于:https://www.cnblogs.com/hongchengshise/p/10404355.html
總結
以上是生活随笔為你收集整理的Thread-方法以及wait、notify简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 扎心!“我学了六个月 Python,怎么
- 下一篇: Springboot之多环境打包配置