Java線程阻塞方法sleep()與wait()的全面講解
一、前期基礎(chǔ)知識(shí)儲(chǔ)備
sleep()和wait()方法都是Java中造成線程阻塞的方法。感興趣的讀者可以參見筆者之前的文章《Java中什么方法導(dǎo)致線程阻塞》,里面詳細(xì)講述了為什么Java要造成線程阻塞和Java中造成線程阻塞的幾種方法。
(1)線程的生命周期
這是筆者在谷歌圖片中找到的一張簡(jiǎn)單描述線程生命周期的圖片,可以看到,一個(gè)線程正常的生命周期中會(huì)經(jīng)歷“創(chuàng)建”“就緒”“運(yùn)行”“阻塞”“運(yùn)行”“死亡”等幾個(gè)生命周期,其中“阻塞”是我們開發(fā)者非常需要關(guān)注的,因?yàn)橥ㄟ^Java提供的阻塞方法,可以做到資源和線程最合理的調(diào)配,而其中sleep()和wait()方法就是Java中實(shí)現(xiàn)線程阻塞的關(guān)鍵性方法。
(2)sleep()和wait()方法的阻塞線程的場(chǎng)景
我們這里,來看第二張圖片,這張圖片就比較詳細(xì)的向我們展現(xiàn)了一個(gè)線程的完整生命周期中發(fā)生的各種“事件”和調(diào)用的各種方法。
我們來總結(jié)一下sleep()和wait()方法的阻塞場(chǎng)景。
①sleep()實(shí)現(xiàn)線程阻塞的方法,我們稱之為“線程睡眠”,方式是超時(shí)等待,怎么理解?就是sleep()通過傳入“睡眠時(shí)間”作為方法的參數(shù),時(shí)間一到就從“睡眠”中“醒來”;
②wait()方法實(shí)現(xiàn)線程阻塞的方法,我們稱之為“線程等待”,方式有兩種:
1)和sleep()方法一樣,通過傳入“睡眠時(shí)間”作為參數(shù),時(shí)間到了就“醒了”;
2)不傳入時(shí)間,進(jìn)行一次“無限期的等待”,只用通過notify()方法來“喚醒”。
二、sleep()和wait()的區(qū)別
通過上面兩幅圖的展示和筆者的相關(guān)描述,相信讀者你已經(jīng)有幾分清楚了,sleep()和wait()方法的區(qū)別之一,就是實(shí)現(xiàn)線程阻塞的方式不一樣。
那么sleep()和wait()二者還有一個(gè)很大的區(qū)別就是,二者“是否釋放同步鎖”不一樣。我們都知道,多線程開發(fā)中,為了實(shí)現(xiàn)不同線程間的同步會(huì)采用同步鎖的方式——synchronized即在線程使用一個(gè)資源時(shí)為其加鎖,這樣其他的線程便不能訪問那個(gè)資源了,直到解鎖后才可以訪問。
感興趣的讀者可以參考筆者之前文章《利用synchronized實(shí)現(xiàn)線程同步》里面詳細(xì)介紹了多線程開發(fā)中利用synchronized實(shí)現(xiàn)線程同步的方式。
而使用sleep()和wait()兩種方法對(duì)于“CPU執(zhí)行權(quán)”和“同步鎖”的方式不同:
①sleep()釋放CPU執(zhí)行權(quán),但不釋放同步鎖;
②wait()釋放CPU執(zhí)行權(quán),也釋放同步鎖,使得其他線程可以使用同步控制塊或者方法。
以上,就是sleep()和wait()方法的兩個(gè)關(guān)鍵性區(qū)別。
總結(jié):綜上我們利用下表展示sleep()和wait()的所有區(qū)別:
ps:謝謝博友的更正。這里進(jìn)行改正: wait()為Object基類中的方法,調(diào)用時(shí)亦需要捕獲異常,以下為wait()可能拋出的異常:
PS:能用圖說明的問題,我們就用圖來說明,能用表說明的問題,我們就用表來說明,這樣理解起來非常清晰。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
- java中sleep方法和wait方法的五個(gè)區(qū)別
- Java線程中sleep和wait的區(qū)別詳細(xì)介紹
- JAVA線程sleep()和wait()詳解及實(shí)例
- Java中sleep()與wait()的區(qū)別總結(jié)
- 詳解Java中wait和sleep的區(qū)別
- 詳解Java中的sleep()和wait()的區(qū)別
- Java中wait與sleep的區(qū)別講解(wait有參及無參區(qū)別)
- java 中sleep() 和 wait() 的對(duì)比
- java sleep()和wait()的區(qū)別點(diǎn)總結(jié)
- Java面試題篇之Sleep()方法與Wait()方法的區(qū)別詳解
相關(guān)文章
Java中JSON字符串與java對(duì)象的互換實(shí)例詳解
這篇文章主要介紹了在java中,JSON字符串與java對(duì)象的相互轉(zhuǎn)換實(shí)例詳解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08基于Java+SpringBoot實(shí)現(xiàn)人臉識(shí)別搜索
人臉識(shí)別搜索技術(shù)作為現(xiàn)代計(jì)算機(jī)視覺領(lǐng)域的重要研究方向之一,已經(jīng)在多個(gè)領(lǐng)域展現(xiàn)出巨大的應(yīng)用潛力,隨著信息技術(shù)的飛速發(fā)展,人臉識(shí)別搜索在多個(gè)領(lǐng)域得到了廣泛關(guān)注和應(yīng)用,本文旨在探討人臉識(shí)別搜索技術(shù)的背景、原理以及其在實(shí)際應(yīng)用中的意義和挑戰(zhàn)2023-08-08Spring-Cloud Eureka注冊(cè)中心實(shí)現(xiàn)高可用搭建
這篇文章主要介紹了Spring-Cloud Eureka注冊(cè)中心實(shí)現(xiàn)高可用搭建,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04詳解MybatisPlus3.4版本之后分頁(yè)插件的使用
從Mybatis Plus 3.4.0版本開始,不再使用舊版本的PaginationInterceptor ,而是使用MybatisPlusInterceptor。本文就詳細(xì)的介紹一下兩者的區(qū)別,感興趣的可以了解一下2021-11-11Spring boot連接MySQL 8.0可能出現(xiàn)的問題
這篇文章主要給大家介紹了關(guān)于Spring boot連接MySQL 8.0可能出現(xiàn)的問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10JavaEE7+Websockets+GlassFish4打造聊天室
Java EE 7已經(jīng)發(fā)布很久了,新增加了很多新的功能和特性,如新增或更新了不少的JSR標(biāo)準(zhǔn)。其中特別受到關(guān)注的是Websockets。它的一個(gè)好處之一是減少了不必要的網(wǎng)絡(luò)流量。它主要是用于在客戶機(jī)和服務(wù)器之間建立單一的雙向連接。2015-09-09Spring?Boot多個(gè)定時(shí)任務(wù)阻塞問題的解決方法
在日常的項(xiàng)目開發(fā)中,往往會(huì)涉及到一些需要做到定時(shí)執(zhí)行的代碼,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot多個(gè)定時(shí)任務(wù)阻塞問題的解決方法,需要的朋友可以參考下2022-01-01