Java線程等待喚醒幾種方法小結(jié)
線程等待和喚醒有三種實現(xiàn)方法,分別是Object類中的wait、notify;Condition類中的await、signal;LockSupport類中的park、unpark方法。
1、Object類中的wait、notify必須配合Synchronized關(guān)鍵字一起使用,否則會拋出IllegalMonitorStateException異常,并且notify喚醒需要在wait之后,否則無法喚醒。
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一起使用,否則會拋出IllegalMonitorStateException異常,并且signal喚醒需要在await之后使用,否則無法喚醒。
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會生成許可證,park會消費許可證。先調(diào)用park如果未生成許可證,那么會阻塞等待unpark生成許可證,并不會拋出異常。他們只和線程關(guān)聯(lián),且線程最多只能有一個許可證,這意味著每次生成憑證之后,需要等消費完才能繼續(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)備喚醒");
//斷點可以看到unpark先執(zhí)行,之后執(zhí)行park
LockSupport.unpark(thread);
//thread.start()在unpark之后無效,線程必須啟動才能unpark成功
}到此這篇關(guān)于Java線程等待喚醒幾種方法小結(jié)的文章就介紹到這了,更多相關(guān)Java線程等待喚醒內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA使用JDBC導(dǎo)入配置jar包連接MySQL數(shù)據(jù)庫
這篇文章介紹了IDEA使用JDBC安裝配置jar包連接MySQL數(shù)據(jù)庫的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-12-12
詳解Mybatis核心類SqlSessionFactory的構(gòu)建
這篇文章主要為大家詳細介紹了Mybatis核心類SqlSessionFactory的構(gòu)建過程,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-12-12
完美解決MybatisPlus插件分頁查詢不起作用總是查詢?nèi)繑?shù)據(jù)問題
這篇文章主要介紹了解決MybatisPlus插件分頁查詢不起作用總是查詢?nèi)繑?shù)據(jù)問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
java字符轉(zhuǎn)碼的三種方法總結(jié)及實例
這篇文章主要介紹了 java字符轉(zhuǎn)碼的三種方法總結(jié)及實例的相關(guān)資料,需要的朋友可以參考下2017-03-03
Java?8函數(shù)式接口之Consumer用法示例詳解
這篇文章主要為大家介紹了Java?8函數(shù)式接口之Consumer用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07

