Java線程等待喚醒幾種方法小結(jié)
線程等待和喚醒有三種實(shí)現(xiàn)方法,分別是Object類中的wait、notify;Condition類中的await、signal;LockSupport類中的park、unpark方法。
1、Object類中的wait、notify必須配合Synchronized關(guān)鍵字一起使用,否則會(huì)拋出IllegalMonitorStateException異常,并且notify喚醒需要在wait之后,否則無(wú)法喚醒。
public static void main(String[] args) { Object o = new Object(); new Thread(()->{ synchronized (o) { try { o.wait(); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("被喚醒"); } }).start(); System.out.println("準(zhǔn)備喚醒"); synchronized (o) { o.notify(); } }
2、Condition類中的await、signal必須配合Lock.lock、unlock一起使用,否則會(huì)拋出IllegalMonitorStateException異常,并且signal喚醒需要在await之后使用,否則無(wú)法喚醒。
public static void main(String[] args) { Lock reentrantLock = new ReentrantLock(); Condition condition = reentrantLock.newCondition(); new Thread(()->{ reentrantLock.lock(); try { condition.await(); System.out.println("被喚醒"); } catch (InterruptedException e) { throw new RuntimeException(e); } finally { reentrantLock.unlock(); } }).start(); System.out.println("準(zhǔn)備喚醒"); reentrantLock.lock(); try { condition.signal(); Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } finally { reentrantLock.unlock(); } }
3、LockSupport類中的park、unpark屬于靜態(tài)方法,unpark會(huì)生成許可證,park會(huì)消費(fèi)許可證。先調(diào)用park如果未生成許可證,那么會(huì)阻塞等待unpark生成許可證,并不會(huì)拋出異常。他們只和線程關(guān)聯(lián),且線程最多只能有一個(gè)許可證,這意味著每次生成憑證之后,需要等消費(fèi)完才能繼續(xù)生成憑證。
public static void main(String[] args) { Thread thread = new Thread(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } LockSupport.park(); System.out.println("被喚醒"); }); thread.start(); System.out.println("準(zhǔn)備喚醒"); //斷點(diǎn)可以看到unpark先執(zhí)行,之后執(zhí)行park LockSupport.unpark(thread); //thread.start()在unpark之后無(wú)效,線程必須啟動(dòng)才能unpark成功 }
到此這篇關(guān)于Java線程等待喚醒幾種方法小結(jié)的文章就介紹到這了,更多相關(guān)Java線程等待喚醒內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用maven?shade插件解決項(xiàng)目版本沖突詳解
這篇文章主要為大家介紹了使用maven?shade插件解決項(xiàng)目版本沖突詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09五分鐘帶你學(xué)會(huì)用java解析json字符串
這篇文章主要給大家介紹了關(guān)于用java解析json字符串的相關(guān)資料,JSON是一種輕量級(jí)的、基于文本的、與語(yǔ)言無(wú)關(guān)的數(shù)據(jù)交換格式,易于人和機(jī)器讀寫,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07IDEA使用JDBC導(dǎo)入配置jar包連接MySQL數(shù)據(jù)庫(kù)
這篇文章介紹了IDEA使用JDBC安裝配置jar包連接MySQL數(shù)據(jù)庫(kù)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-12-12Java程序初始化啟動(dòng)自動(dòng)執(zhí)行的三種方式
這篇文章主要介紹了Java程序初始化啟動(dòng)自動(dòng)執(zhí)行的三種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01詳解Mybatis核心類SqlSessionFactory的構(gòu)建
這篇文章主要為大家詳細(xì)介紹了Mybatis核心類SqlSessionFactory的構(gòu)建過(guò)程,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-12-12完美解決MybatisPlus插件分頁(yè)查詢不起作用總是查詢?nèi)繑?shù)據(jù)問(wèn)題
這篇文章主要介紹了解決MybatisPlus插件分頁(yè)查詢不起作用總是查詢?nèi)繑?shù)據(jù)問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08java字符轉(zhuǎn)碼的三種方法總結(jié)及實(shí)例
這篇文章主要介紹了 java字符轉(zhuǎn)碼的三種方法總結(jié)及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03Java?8函數(shù)式接口之Consumer用法示例詳解
這篇文章主要為大家介紹了Java?8函數(shù)式接口之Consumer用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07