java使用wait()和notify()線程間通訊的實(shí)現(xiàn)
線程.wait()
當(dāng)一個(gè)線程調(diào)用 線程.wait()時(shí),它會(huì)釋放對(duì)象的鎖,讓其他線程可以獲得這個(gè)鎖并執(zhí)行相應(yīng)的同步代碼塊,同時(shí),如果未配置超時(shí)時(shí)間,該線程會(huì)無(wú)限期等待,直到接收到線程.notify()信號(hào),注意,一般情況下要在同步代碼塊中執(zhí)行。
線程.notify()
當(dāng)一個(gè)線程調(diào)用 線程.notify()時(shí),它會(huì)給線程發(fā)送一個(gè)信號(hào),讓其在線程.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í)會(huì)釋放 main 對(duì)象的鎖,而不是一直占用鎖。
這是 Java 中 wait() 方法的特性之一。
當(dāng)一個(gè)線程調(diào)用 wait() 方法時(shí),它會(huì)釋放對(duì)象的鎖,讓其他線程可以獲得這個(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
又又叕出BUG啦!理智分析Java NIO的ByteBuffer到底有多難用
網(wǎng)絡(luò)數(shù)據(jù)的基本單位永遠(yuǎn)是byte,Java NIO提供ByteBuffer作為字節(jié)的容器,但該類過(guò)于復(fù)雜,有點(diǎn)難用.本篇文章就帶大家簡(jiǎn)單了解一下 ,需要的朋友可以參考下2021-06-06
java.lang.UnsupportedClassVersionError錯(cuò)誤的解決辦法(附圖文)
這篇文章主要給大家介紹了關(guān)于java.lang.UnsupportedClassVersionError錯(cuò)誤的解決辦法,"java.lang.UnsupportedClassVersionError"意味著您正在運(yùn)行的Java版本與編譯該類時(shí)使用的Java版本不兼容,需要的朋友可以參考下2023-10-10
SpringBoot項(xiàng)目中Maven剔除無(wú)用Jar引用的最佳實(shí)踐
在?Spring?Boot?項(xiàng)目開發(fā)中,Maven?是最常用的構(gòu)建工具之一,通過(guò)?Maven,我們可以輕松地管理項(xiàng)目所需的依賴,而,隨著項(xiàng)目的復(fù)雜化,無(wú)用的?Jar?包引用可能會(huì)逐漸增多,本文旨在詳細(xì)解析如何在?Spring?Boot?項(xiàng)目中剔除無(wú)用的?Jar?引用,需要的朋友可以參考下2025-01-01
Java實(shí)現(xiàn)微信紅包分配規(guī)則
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)仿微信紅包分配規(guī)則,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02
SpringBoot使用編程方式配置DataSource的方法
這篇文章主要介紹了SpringBoot使用編程方式配置DataSource的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
MySQL性能優(yōu)化之配置參數(shù)過(guò)程
優(yōu)化MySQL配置:調(diào)整連接數(shù)、超時(shí)時(shí)間及緩沖區(qū)大小,提升性能,建議修改back_log為128-512,interactive_timeout為7200,合理設(shè)置InnoDB參數(shù)及緩存策略2025-09-09

