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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解Mybatis核心類SqlSessionFactory的構建
這篇文章主要為大家詳細介紹了Mybatis核心類SqlSessionFactory的構建過程,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2022-12-12完美解決MybatisPlus插件分頁查詢不起作用總是查詢全部數據問題
這篇文章主要介紹了解決MybatisPlus插件分頁查詢不起作用總是查詢全部數據問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08