Java線程等待喚醒幾種方法小結
線程等待和喚醒有三種實現(xiàn)方法,分別是Object類中的wait、notify;Condition類中的await、signal;LockSupport類中的park、unpark方法。
1、Object類中的wait、notify必須配合Synchronized關鍵字一起使用,否則會拋出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("準備喚醒");
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("準備喚醒");
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會消費許可證。先調用park如果未生成許可證,那么會阻塞等待unpark生成許可證,并不會拋出異常。他們只和線程關聯(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("準備喚醒");
//斷點可以看到unpark先執(zhí)行,之后執(zhí)行park
LockSupport.unpark(thread);
//thread.start()在unpark之后無效,線程必須啟動才能unpark成功
}到此這篇關于Java線程等待喚醒幾種方法小結的文章就介紹到這了,更多相關Java線程等待喚醒內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解SpringBoot實現(xiàn)JPA的save方法不更新null屬性
直接調用原生Save方法會導致null屬性覆蓋到數(shù)據(jù)庫,使用起來十分不方便。本文詳細的介紹了如何解決這個問題,非常具有實用價值,需要的朋友可以參考下2018-12-12
MyBatis實現(xiàn)多表聯(lián)合查詢resultType的返回值
這篇文章主要介紹了MyBatis多表聯(lián)合查詢resultType的返回值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
spring Mvc配置xml使ResponseBody返回Json的方法示例
這篇文章主要給大家介紹了關于spring Mvc配置xml使ResponseBody返回Json的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-04-04

