java使用wait()和notify()線程間通訊的實(shí)現(xiàn)
線程.wait()
當(dāng)一個(gè)線程調(diào)用 線程.wait()
時(shí),它會釋放對象的鎖,讓其他線程可以獲得這個(gè)鎖并執(zhí)行相應(yīng)的同步代碼塊,同時(shí),如果未配置超時(shí)時(shí)間,該線程會無限期等待,直到接收到線程.notify()
信號,注意,一般情況下要在同步代碼塊中執(zhí)行。
線程.notify()
當(dāng)一個(gè)線程調(diào)用 線程.notify()
時(shí),它會給線程發(fā)送一個(gè)信號,讓其在線程.notify()
卡住的地方繼續(xù)執(zhí)行,注意,一般情況下要在同步代碼塊中執(zhí)行。
示例
下面是一個(gè)演示線程間通訊的示例,在一個(gè)定時(shí)任務(wù)中達(dá)成某個(gè)條件時(shí),通知主線程繼續(xù)執(zhí)行,同時(shí)關(guān)閉該定時(shí)任務(wù):
public static void main(String[] args) throws InterruptedException { final Thread main = Thread.currentThread(); main.setName("main thread"); // 創(chuàng)建一個(gè)默認(rèn)定時(shí)任務(wù) ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor( 5, // 核心線程數(shù) new ThreadPoolExecutor.CallerRunsPolicy() // 隊(duì)列滿后的拒絕策略 ); AtomicInteger flag = new AtomicInteger(0); // 執(zhí)行定時(shí)任務(wù) final ScheduledFuture<?> queryTask = executor.scheduleAtFixedRate(() -> { // 在這里執(zhí)行您的定時(shí)任務(wù)邏輯 final int i = flag.addAndGet(1); log.info("定時(shí)任務(wù)執(zhí)行了1!flag={}", i); if (i == 5) { synchronized (main) { System.out.println("通知主線程取消該任務(wù)"); main.notify(); } } }, 0, 3, TimeUnit.SECONDS); final ScheduledFuture<?> printTask = executor.scheduleAtFixedRate(() -> { // 在這里執(zhí)行您的定時(shí)任務(wù)邏輯 log.info("定時(shí)任務(wù)執(zhí)行了2!"); }, 0, 3, TimeUnit.SECONDS); log.info("main wait"); synchronized (main) { /** * 主線程在執(zhí)行 main.wait() 進(jìn)入等待狀態(tài)后,確實(shí)會釋放 main 對象的鎖,而不是一直占用鎖。 這是 Java 中 wait() 方法的特性之一。 當(dāng)一個(gè)線程調(diào)用 wait() 方法時(shí),它會釋放對象的鎖,讓其他線程可以獲得這個(gè)鎖并執(zhí)行相應(yīng)的同步代碼塊。 */ main.wait(); } log.info("main 活了"); // 取消定時(shí)任務(wù) queryTask.cancel(true); log.info("scheduledFuture被取消"); }
運(yùn)行結(jié)果:
11:14:50.838 [main thread] INFO MyTaskConfig - main wait
11:14:50.838 [pool-1-thread-2] INFO MyTaskConfig - 定時(shí)任務(wù)執(zhí)行了2!
11:14:50.838 [pool-1-thread-1] INFO MyTaskConfig - 定時(shí)任務(wù)執(zhí)行了1!flag=1
11:14:53.845 [pool-1-thread-1] INFO MyTaskConfig - 定時(shí)任務(wù)執(zhí)行了2!
11:14:53.845 [pool-1-thread-2] INFO MyTaskConfig - 定時(shí)任務(wù)執(zhí)行了1!flag=2
11:14:56.841 [pool-1-thread-2] INFO MyTaskConfig - 定時(shí)任務(wù)執(zhí)行了1!flag=3
11:14:56.842 [pool-1-thread-3] INFO MyTaskConfig - 定時(shí)任務(wù)執(zhí)行了2!
11:14:59.841 [pool-1-thread-4] INFO MyTaskConfig - 定時(shí)任務(wù)執(zhí)行了1!flag=4
11:14:59.841 [pool-1-thread-1] INFO MyTaskConfig - 定時(shí)任務(wù)執(zhí)行了2!
11:15:02.848 [pool-1-thread-2] INFO MyTaskConfig - 定時(shí)任務(wù)執(zhí)行了2!
11:15:02.848 [pool-1-thread-4] INFO MyTaskConfig - 定時(shí)任務(wù)執(zhí)行了1!flag=5
通知主線程取消該任務(wù)
11:15:02.848 [main thread] INFO MyTaskConfig - main 活了
11:15:02.848 [main thread] INFO MyTaskConfig - scheduledFuture被取消
11:15:05.835 [pool-1-thread-2] INFO MyTaskConfig - 定時(shí)任務(wù)執(zhí)行了2!
11:15:08.843 [pool-1-thread-2] INFO MyTaskConfig - 定時(shí)任務(wù)執(zhí)行了2!
11:15:11.836 [pool-1-thread-2] INFO MyTaskConfig - 定時(shí)任務(wù)執(zhí)行了2!
到此這篇關(guān)于java使用wait()和notify()線程間通訊的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)java wait()和notify()線程間通訊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
jmeter接口測試教程及接口測試流程詳解(全網(wǎng)僅有)
Jmeter是由Apache公司開發(fā)的一個(gè)純Java的開源項(xiàng)目,即可以用于做接口測試也可以用于做性能測試。本文給大家分享jmeter接口測試教程及接口測試流程,感興趣的朋友跟隨小編一起看看吧2021-12-12使用AOP攔截Controller獲取@PathVariable注解傳入的參數(shù)
這篇文章主要介紹了使用AOP攔截Controller獲取@PathVariable注解傳入的參數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08IDEA創(chuàng)建Spring項(xiàng)目無法選擇Java8的問題及解決
文章描述了在使用Spring創(chuàng)建項(xiàng)目時(shí)遇到的問題,通過將服務(wù)器地址從https://start.spring.io/替換為https://start.aliyun.com/,成功解決了無法選擇Java8的問題2025-01-01jasypt SaltGenerator接口定義方法源碼解讀
這篇文章主要為大家介紹了jasypt SaltGenerator接口定義方法源碼解讀,,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09SpringBoot3整合Druid監(jiān)控功能的項(xiàng)目實(shí)踐
Druid連接池作為一款強(qiáng)大的數(shù)據(jù)庫連接池,提供了豐富的監(jiān)控和管理功能,成為很多Java項(xiàng)目的首選,本文主要介紹了SpringBoot3整合Druid監(jiān)控功能的項(xiàng)目實(shí)踐,感興趣的可以了解一下2024-01-01