Java線(xiàn)程中sleep和wait的區(qū)別詳細(xì)介紹
共同點(diǎn):
1. 他們都是在多線(xiàn)程的環(huán)境下,都可以在程序的調(diào)用處阻塞指定的毫秒數(shù),并返回。
2. wait()和sleep()都可以通過(guò)interrupt()方法 打斷線(xiàn)程的暫停狀態(tài) ,從而使線(xiàn)程立刻拋出InterruptedException。
如果線(xiàn)程A希望立即結(jié)束線(xiàn)程B,則可以對(duì)線(xiàn)程B對(duì)應(yīng)的Thread實(shí)例調(diào)用interrupt方法。如果此刻線(xiàn)程B正在wait/sleep/join,則線(xiàn)程B會(huì)立刻拋出InterruptedException,在catch() {} 中直接return即可安全地結(jié)束線(xiàn)程。
需要注意的是,InterruptedException是線(xiàn)程自己從內(nèi)部拋出的,并不是interrupt()方法拋出的。對(duì)某一線(xiàn)程調(diào)用 interrupt()時(shí),如果該線(xiàn)程正在執(zhí)行普通的代碼,那么該線(xiàn)程根本就不會(huì)拋出InterruptedException。但是,一旦該線(xiàn)程進(jìn)入到 wait()/sleep()/join()后,就會(huì)立刻拋出InterruptedException 。
不同點(diǎn):
1.Thread類(lèi)的方法:sleep(),yield()等
Object的方法:wait()和notify()等
2.每個(gè)對(duì)象都有一個(gè)鎖來(lái)控制同步訪問(wèn)。Synchronized關(guān)鍵字可以和對(duì)象的鎖交互,來(lái)實(shí)現(xiàn)線(xiàn)程的同步。
sleep方法沒(méi)有釋放鎖,而wait方法釋放了鎖,使得其他線(xiàn)程可以使用同步控制塊或者方法。
3.wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用
4.sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
線(xiàn)程的調(diào)度
線(xiàn)程調(diào)度器按線(xiàn)程的優(yōu)先級(jí)高低選擇高優(yōu)先級(jí)線(xiàn)程(進(jìn)入運(yùn)行中狀態(tài))執(zhí)行,同時(shí)線(xiàn)程調(diào)度是搶先式調(diào)度,即如果在當(dāng)前線(xiàn)程執(zhí)行過(guò)程中,一個(gè)更高優(yōu)先級(jí)的線(xiàn)程進(jìn)入可運(yùn)行狀態(tài),則這個(gè)線(xiàn)程立即被調(diào)度執(zhí)行。
搶先式調(diào)度又分為:時(shí)間片方式和獨(dú)占方式。在時(shí)間片方式下,當(dāng)前活動(dòng)線(xiàn)程執(zhí)行完當(dāng)前時(shí)間片后,如果有其他處于就緒狀態(tài)的相同優(yōu)先級(jí)的線(xiàn)程,系統(tǒng)會(huì)將執(zhí)行權(quán)交給其他就緒態(tài)的同優(yōu)先級(jí)線(xiàn)程;當(dāng)前活動(dòng)線(xiàn)程轉(zhuǎn)入等待執(zhí)行隊(duì)列,等待下一個(gè)時(shí)間片的調(diào)度。
在獨(dú)占方式下,當(dāng)前活動(dòng)線(xiàn)程一旦獲得執(zhí)行權(quán),將一直執(zhí)行下去,直到執(zhí)行完畢或由于某種原因主動(dòng)放棄CPU,或者是有一高優(yōu)先級(jí)的線(xiàn)程處于就緒狀態(tài)。
舉例說(shuō)明
首先我想說(shuō)的是:在多線(xiàn)程編程中,經(jīng)常會(huì)使用sleep與wait操作,我們理解sleep與wait的最大區(qū)別是sleep等待是不會(huì)釋放當(dāng)前鎖,而wait則反之。我今天想到一個(gè)現(xiàn)實(shí)例子來(lái)比較這兩者的區(qū)別。
我以去火車(chē)站買(mǎi)票的例子來(lái)說(shuō)明。我們?nèi)セ疖?chē)站買(mǎi)票,當(dāng)站到售票窗口前要告訴售票員需要到哪里的票,什么時(shí)候發(fā)車(chē)的,售票員就通過(guò)電腦去給我們打印票,這個(gè)時(shí)候我們就得等待。如果我們用sleep模式,就得一直站在那里等,直到售票員給我們票;如果用wait模式,這個(gè)時(shí)候就離開(kāi)我們所站的位置,后面的票友就可能站到我當(dāng)前的位置(窗口前),我們要取票的話(huà),就得重新排在隊(duì)伍后面去取票。
- java中sleep方法和wait方法的五個(gè)區(qū)別
- Java中sleep()與wait()的區(qū)別總結(jié)
- Java面試題篇之Sleep()方法與Wait()方法的區(qū)別詳解
- 詳解Java中wait和sleep的區(qū)別
- 詳解Java中的sleep()和wait()的區(qū)別
- Java中wait與sleep的區(qū)別講解(wait有參及無(wú)參區(qū)別)
- java sleep()和wait()的區(qū)別點(diǎn)總結(jié)
- Java詳細(xì)分析sleep和wait方法有哪些區(qū)別
- java面試突擊之sleep和wait有什么區(qū)別詳析
- Java中wait()與sleep()兩者的不同深入解析
相關(guān)文章
SpringBoot整合MyBatis實(shí)現(xiàn)樂(lè)觀鎖和悲觀鎖的示例
這篇文章主要介紹了SpringBoot整合MyBatis實(shí)現(xiàn)樂(lè)觀鎖和悲觀鎖的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09解決spring-integration-mqtt頻繁報(bào)Lost connection錯(cuò)誤問(wèn)題
這篇文章主要介紹了解決spring-integration-mqtt頻繁報(bào)Lost connection錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03使用eclipse + maven一步步搭建SSM框架教程詳解
SSM(Spring+SpringMVC+MyBatis)框架集由Spring、SpringMVC、MyBatis三個(gè)開(kāi)源框架整合而成,常作為數(shù)據(jù)源較簡(jiǎn)單的web項(xiàng)目的框架.這篇文章主要介紹了eclipse + maven搭建SSM框架 ,需要的朋友可以參考下2017-11-11MyBatis-Plus與Druid結(jié)合Dynamic-datasource實(shí)現(xiàn)多數(shù)據(jù)源操作數(shù)據(jù)庫(kù)的示例
Dynamic-DataSource 可以和絕大多是連接層插件搭配使用,比如:mybatis,mybatis-plus,hibernate等,本文就來(lái)介紹一下MyBatis-Plus與Druid結(jié)合Dynamic-datasource實(shí)現(xiàn)多數(shù)據(jù)源操作數(shù)據(jù)庫(kù)的示例,感興趣的可以了解一下2023-10-10SpringBoot連接MySql數(shù)據(jù)庫(kù)的原理及代碼示例
SpringBoot是一款流行的Java開(kāi)發(fā)框架,它可以輕松地連接各種類(lèi)型的數(shù)據(jù)庫(kù),包括關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù),本文將介紹SpringBoot是如何連接數(shù)據(jù)庫(kù)的,包括其原理和代碼示例,需要的朋友可以參考下2023-07-07SpringBoot Admin升級(jí)boot等組件版本后無(wú)法監(jiān)控微服務(wù)問(wèn)題
這篇文章主要介紹了SpringBoot Admin升級(jí)boot等組件版本后無(wú)法監(jiān)控微服務(wù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08J2EE項(xiàng)目代碼編寫(xiě)規(guī)范分享
這篇文章主要介紹了J2EE項(xiàng)目代碼編寫(xiě)規(guī)范分享,需要的朋友可以參考下2014-10-10mybatis mapper.xml獲取insert后的自增ID問(wèn)題
這篇文章主要介紹了mybatis mapper.xml獲取insert后的自增ID問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05