亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java使用wait()和notify()線程間通訊的實(shí)現(xiàn)

 更新時(shí)間:2023年09月01日 15:54:25   作者:L-960  
Java 線程通信是將多個(gè)獨(dú)立的線程個(gè)體進(jìn)行關(guān)聯(lián)處理,使得線程與線程之間能進(jìn)行相互通信,本文就介紹了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接口測試教程及接口測試流程詳解(全網(wǎng)僅有)

    Jmeter是由Apache公司開發(fā)的一個(gè)純Java的開源項(xiàng)目,即可以用于做接口測試也可以用于做性能測試。本文給大家分享jmeter接口測試教程及接口測試流程,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • 使用AOP攔截Controller獲取@PathVariable注解傳入的參數(shù)

    使用AOP攔截Controller獲取@PathVariable注解傳入的參數(shù)

    這篇文章主要介紹了使用AOP攔截Controller獲取@PathVariable注解傳入的參數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • IDEA創(chuàng)建Spring項(xiàng)目無法選擇Java8的問題及解決

    IDEA創(chuàng)建Spring項(xiàng)目無法選擇Java8的問題及解決

    文章描述了在使用Spring創(chuàng)建項(xiàng)目時(shí)遇到的問題,通過將服務(wù)器地址從https://start.spring.io/替換為https://start.aliyun.com/,成功解決了無法選擇Java8的問題
    2025-01-01
  • 如何處理器攔截器(HandlerInterceptor)

    如何處理器攔截器(HandlerInterceptor)

    這篇文章主要介紹了如何處理器攔截器(HandlerInterceptor)問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot集成EasyExcel的步驟

    SpringBoot集成EasyExcel的步驟

    EasyExcel是阿里巴巴開源poi插件之一,主要解決了poi框架使用復(fù)雜,sax解析模式不容易操作,數(shù)據(jù)量大起來容易OOM,解決了POI并發(fā)造成的報(bào)錯。主要解決方式:通過解壓文件的方式加載,一行一行的加載,并且拋棄樣式字體等不重要的數(shù)據(jù),降低內(nèi)存的占用。
    2021-06-06
  • SpringBoot中@Autowired生效方式詳解

    SpringBoot中@Autowired生效方式詳解

    @Autowired注解可以用在類屬性,構(gòu)造函數(shù),setter方法和函數(shù)參數(shù)上,該注解可以準(zhǔn)確地控制bean在何處如何自動裝配的過程。在默認(rèn)情況下,該注解是類型驅(qū)動的注入
    2022-06-06
  • jasypt SaltGenerator接口定義方法源碼解讀

    jasypt SaltGenerator接口定義方法源碼解讀

    這篇文章主要為大家介紹了jasypt SaltGenerator接口定義方法源碼解讀,,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Java中判斷對象是否相等的equals()方法使用教程

    Java中判斷對象是否相等的equals()方法使用教程

    與==運(yùn)算符響應(yīng),equals()方法也是Java中對對象進(jìn)行比較的一大方式,要特別注意二者的不同點(diǎn),這個(gè)我們在下文中即將講到,接下來我們就來看一下Java中判斷對象是否相等的equals()方法使用教程
    2016-05-05
  • SpringBoot3整合Druid監(jiān)控功能的項(xiàng)目實(shí)踐

    SpringBoot3整合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
  • 使用Java實(shí)現(xiàn)解析Excel公式

    使用Java實(shí)現(xiàn)解析Excel公式

    在日常工作中,我們經(jīng)常需要在Excel中使用公式對表中數(shù)據(jù)進(jìn)行計(jì)算和分析,所以本文小編主要來和大家介紹一下如何在Java中實(shí)現(xiàn)解析Excel公式,感興趣的可以了解下
    2024-02-02

最新評論