java使用wait()和notify()線程間通訊的實現(xiàn)
線程.wait()
當一個線程調用 線程.wait()時,它會釋放對象的鎖,讓其他線程可以獲得這個鎖并執(zhí)行相應的同步代碼塊,同時,如果未配置超時時間,該線程會無限期等待,直到接收到線程.notify()信號,注意,一般情況下要在同步代碼塊中執(zhí)行。
線程.notify()
當一個線程調用 線程.notify()時,它會給線程發(fā)送一個信號,讓其在線程.notify()卡住的地方繼續(xù)執(zhí)行,注意,一般情況下要在同步代碼塊中執(zhí)行。
示例
下面是一個演示線程間通訊的示例,在一個定時任務中達成某個條件時,通知主線程繼續(xù)執(zhí)行,同時關閉該定時任務:
public static void main(String[] args) throws InterruptedException {
final Thread main = Thread.currentThread();
main.setName("main thread");
// 創(chuàng)建一個默認定時任務
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(
5, // 核心線程數(shù)
new ThreadPoolExecutor.CallerRunsPolicy() // 隊列滿后的拒絕策略
);
AtomicInteger flag = new AtomicInteger(0);
// 執(zhí)行定時任務
final ScheduledFuture<?> queryTask = executor.scheduleAtFixedRate(() -> {
// 在這里執(zhí)行您的定時任務邏輯
final int i = flag.addAndGet(1);
log.info("定時任務執(zhí)行了1!flag={}", i);
if (i == 5) {
synchronized (main) {
System.out.println("通知主線程取消該任務");
main.notify();
}
}
}, 0, 3, TimeUnit.SECONDS);
final ScheduledFuture<?> printTask = executor.scheduleAtFixedRate(() -> {
// 在這里執(zhí)行您的定時任務邏輯
log.info("定時任務執(zhí)行了2!");
}, 0, 3, TimeUnit.SECONDS);
log.info("main wait");
synchronized (main) {
/**
*
主線程在執(zhí)行 main.wait() 進入等待狀態(tài)后,確實會釋放 main 對象的鎖,而不是一直占用鎖。
這是 Java 中 wait() 方法的特性之一。
當一個線程調用 wait() 方法時,它會釋放對象的鎖,讓其他線程可以獲得這個鎖并執(zhí)行相應的同步代碼塊。
*/
main.wait();
}
log.info("main 活了");
// 取消定時任務
queryTask.cancel(true);
log.info("scheduledFuture被取消");
}運行結果:
11:14:50.838 [main thread] INFO MyTaskConfig - main wait
11:14:50.838 [pool-1-thread-2] INFO MyTaskConfig - 定時任務執(zhí)行了2!
11:14:50.838 [pool-1-thread-1] INFO MyTaskConfig - 定時任務執(zhí)行了1!flag=1
11:14:53.845 [pool-1-thread-1] INFO MyTaskConfig - 定時任務執(zhí)行了2!
11:14:53.845 [pool-1-thread-2] INFO MyTaskConfig - 定時任務執(zhí)行了1!flag=2
11:14:56.841 [pool-1-thread-2] INFO MyTaskConfig - 定時任務執(zhí)行了1!flag=3
11:14:56.842 [pool-1-thread-3] INFO MyTaskConfig - 定時任務執(zhí)行了2!
11:14:59.841 [pool-1-thread-4] INFO MyTaskConfig - 定時任務執(zhí)行了1!flag=4
11:14:59.841 [pool-1-thread-1] INFO MyTaskConfig - 定時任務執(zhí)行了2!
11:15:02.848 [pool-1-thread-2] INFO MyTaskConfig - 定時任務執(zhí)行了2!
11:15:02.848 [pool-1-thread-4] INFO MyTaskConfig - 定時任務執(zhí)行了1!flag=5
通知主線程取消該任務
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 - 定時任務執(zhí)行了2!
11:15:08.843 [pool-1-thread-2] INFO MyTaskConfig - 定時任務執(zhí)行了2!
11:15:11.836 [pool-1-thread-2] INFO MyTaskConfig - 定時任務執(zhí)行了2!
到此這篇關于java使用wait()和notify()線程間通訊的實現(xiàn)的文章就介紹到這了,更多相關java wait()和notify()線程間通訊內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
又又叕出BUG啦!理智分析Java NIO的ByteBuffer到底有多難用
網絡數(shù)據(jù)的基本單位永遠是byte,Java NIO提供ByteBuffer作為字節(jié)的容器,但該類過于復雜,有點難用.本篇文章就帶大家簡單了解一下 ,需要的朋友可以參考下2021-06-06
java.lang.UnsupportedClassVersionError錯誤的解決辦法(附圖文)
這篇文章主要給大家介紹了關于java.lang.UnsupportedClassVersionError錯誤的解決辦法,"java.lang.UnsupportedClassVersionError"意味著您正在運行的Java版本與編譯該類時使用的Java版本不兼容,需要的朋友可以參考下2023-10-10
SpringBoot項目中Maven剔除無用Jar引用的最佳實踐
在?Spring?Boot?項目開發(fā)中,Maven?是最常用的構建工具之一,通過?Maven,我們可以輕松地管理項目所需的依賴,而,隨著項目的復雜化,無用的?Jar?包引用可能會逐漸增多,本文旨在詳細解析如何在?Spring?Boot?項目中剔除無用的?Jar?引用,需要的朋友可以參考下2025-01-01
SpringBoot使用編程方式配置DataSource的方法
這篇文章主要介紹了SpringBoot使用編程方式配置DataSource的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01

