最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用CountDownLatch實現(xiàn)網(wǎng)絡(luò)同步請求的示例代碼

 更新時間:2023年01月04日 15:07:36   作者:抓手  
CountDownLatch 是一個同步工具類,用來協(xié)調(diào)多個線程之間的同步,它能夠使一個線程在等待另外一些線程完成各自工作之后,再繼續(xù)執(zhí)行。被將利用CountDownLatch實現(xiàn)網(wǎng)絡(luò)同步請求,異步同時獲取商品信息組裝,感興趣的可以了解一下

CountDownLatch 是一個同步工具類,用來協(xié)調(diào)多個線程之間的同步,它能夠使一個線程在等待另外一些線程完成各自工作之后,再繼續(xù)執(zhí)行。

這里是使用CountDownLatch和多線程完成商品信息異步組裝:

import java.time.LocalDateTime;
import java.util.StringJoiner;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
/**
 * @author 向振華
 * @date 2023/01/04 14:01
 */
public class Test {
 
    public static void main(String[] args) {
 
        // 創(chuàng)建線程池
        ExecutorService executorService = Executors.newFixedThreadPool(10);
 
        CountDownLatch countDownLatch = new CountDownLatch(3);
 
        System.out.println("開始 " + LocalDateTime.now());
 
        StringJoiner sj = new StringJoiner("、");
 
        // 線程1
        executorService.execute(() -> {
            try {
                String do1 = do1();
                sj.add(do1);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                countDownLatch.countDown();
            }
        });
 
        // 線程2
        executorService.execute(() -> {
            try {
                String do2 = do2();
                sj.add(do2);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                countDownLatch.countDown();
            }
        });
 
        // 線程3
        executorService.execute(() -> {
            try {
                String do3 = do3();
                sj.add(do3);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                countDownLatch.countDown();
            }
        });
 
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
 
        System.out.println(sj.toString());
        System.out.println("完成 " + LocalDateTime.now());
    }
 
    private static String do1() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("1查詢商品規(guī)格信息");
        return "商品規(guī)格";
    }
 
    private static String do2() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("2查詢商品價格信息");
        return "商品價格";
    }
 
    private static String do3() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("3查詢商品圖片信息");
        return "商品圖片";
    }
}

輸出結(jié)果:

開始 2023-01-04T14:16:40.441
1查詢商品規(guī)格信息
3查詢商品圖片信息
2查詢商品價格信息
商品規(guī)格、商品圖片、商品價格
完成 2023-01-04T14:16:45.468

知識補(bǔ)充

1.背景

  • countDownLatch是在java1.5被引入,跟它一起被引入的工具類還有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue。
  • 存在于java.util.cucurrent包下

2.概念

countDownLatch這個類使一個線程等待其他線程各自執(zhí)行完畢后再執(zhí)行。

是通過一個計數(shù)器來實現(xiàn)的,計數(shù)器的初始值是線程的數(shù)量。每當(dāng)一個線程執(zhí)行完畢后,計數(shù)器的值就-1,當(dāng)計數(shù)器的值為0時,表示所有線程都執(zhí)行完畢,然后在閉鎖上等待的線程就可以恢復(fù)工作了。

3.源碼

countDownLatch類中只提供了一個構(gòu)造器:

//參數(shù)count為計數(shù)值
public CountDownLatch(int count) {  };  

類中有三個方法是最重要的:

//調(diào)用await()方法的線程會被掛起,它會等待直到count值為0才繼續(xù)執(zhí)行
public void await() throws InterruptedException { };   
//和await()類似,只不過等待一定的時間后count值還沒變?yōu)?的話就會繼續(xù)執(zhí)行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  
//將count值減1
public void countDown() { };  

4.示例

普通示例

public class CountDownLatchTest {

    public static void main(String[] args) {
        final CountDownLatch latch = new CountDownLatch(2);
        System.out.println("主線程開始執(zhí)行…… ……");
        //第一個子線程執(zhí)行
        ExecutorService es1 = Executors.newSingleThreadExecutor();
        es1.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                    System.out.println("子線程:"+Thread.currentThread().getName()+"執(zhí)行");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                latch.countDown();
            }
        });
        es1.shutdown();

        //第二個子線程執(zhí)行
        ExecutorService es2 = Executors.newSingleThreadExecutor();
        es2.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("子線程:"+Thread.currentThread().getName()+"執(zhí)行");
                latch.countDown();
            }
        });
        es2.shutdown();
        System.out.println("等待兩個線程執(zhí)行完畢…… ……");
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("兩個子線程都執(zhí)行完畢,繼續(xù)執(zhí)行主線程");
    }
}

結(jié)果集:

主線程開始執(zhí)行…… ……
等待兩個線程執(zhí)行完畢…… ……
子線程:pool-1-thread-1執(zhí)行
子線程:pool-2-thread-1執(zhí)行
兩個子線程都執(zhí)行完畢,繼續(xù)執(zhí)行主線程

到此這篇關(guān)于Java使用CountDownLatch實現(xiàn)網(wǎng)絡(luò)同步請求的示例代碼的文章就介紹到這了,更多相關(guān)Java CountDownLatch網(wǎng)絡(luò)同步請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 15道非常經(jīng)典的Java面試題 附詳細(xì)答案

    15道非常經(jīng)典的Java面試題 附詳細(xì)答案

    這篇文章主要為大家推薦了15道非常經(jīng)典的Java面試題,附詳細(xì)答案,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 分布式系統(tǒng)下調(diào)用鏈追蹤技術(shù)面試題

    分布式系統(tǒng)下調(diào)用鏈追蹤技術(shù)面試題

    這篇文章主要為大家介紹了分布式系統(tǒng)下調(diào)用鏈追蹤技術(shù)面試問題合集,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-03-03
  • Rabbitmq消息推送功能實現(xiàn)示例

    Rabbitmq消息推送功能實現(xiàn)示例

    rabbitMQ為異步消息處理提出了一個很好的解決方案,它是一個非常好用的消息中間件。主要解決當(dāng)生產(chǎn)者大量產(chǎn)生數(shù)據(jù)時,消費者無法快速消費的問題。這個時候需要一個中間層,保存這個數(shù)據(jù),rabbitMQ是一個很好的解決方案
    2022-12-12
  • 詳解SpringMVC實現(xiàn)圖片上傳以及該注意的小細(xì)節(jié)

    詳解SpringMVC實現(xiàn)圖片上傳以及該注意的小細(xì)節(jié)

    本篇文章主要介紹了詳解SpringMVC實現(xiàn)圖片上傳以及該注意的小細(xì)節(jié),具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • redis在java中的使用(實例講解)

    redis在java中的使用(實例講解)

    下面小編就為大家?guī)硪黄猺edis 在java中的使用(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Spring事務(wù)處理原理步驟詳解

    Spring事務(wù)處理原理步驟詳解

    這篇文章主要介紹了Spring事務(wù)處理原理步驟詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • SpringRunner和SpringJUnit4ClassRunner的區(qū)別及說明

    SpringRunner和SpringJUnit4ClassRunner的區(qū)別及說明

    這篇文章主要介紹了SpringRunner和SpringJUnit4ClassRunner的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 關(guān)于Java實現(xiàn)word(docx、doc)轉(zhuǎn)html的完美解決方案

    關(guān)于Java實現(xiàn)word(docx、doc)轉(zhuǎn)html的完美解決方案

    文章介紹了多種將Word文檔轉(zhuǎn)換為HTML的方法,包括使用Microsoft Word自帶的導(dǎo)出功能、第三方工具和編程實現(xiàn),展示了如何實現(xiàn)將.docx文件轉(zhuǎn)換為HTML文件,并自動生成目錄、處理分頁符和增強(qiáng)表格樣式等功能,感興趣的朋友一起看看吧
    2025-01-01
  • Spring boot如何開啟跨域配置

    Spring boot如何開啟跨域配置

    這篇文章主要介紹了Spring boot如何開啟跨域配置問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java注解如何基于Redission實現(xiàn)分布式鎖

    Java注解如何基于Redission實現(xiàn)分布式鎖

    這篇文章主要介紹了Java注解如何基于Redission實現(xiàn)分布式鎖,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01

最新評論

开远市| 永安市| 清镇市| 乳山市| 中宁县| 西丰县| 津南区| 惠安县| 防城港市| 济宁市| 泰宁县| 织金县| 台中县| 榕江县| 海丰县| 万全县| 惠州市| 乐陵市| 都昌县| 柳河县| 抚州市| 宁津县| 鄢陵县| 翼城县| 寻乌县| 西吉县| 福鼎市| 峨边| 辽阳县| 台湾省| 文山县| 泽普县| 镶黄旗| 衡南县| 威海市| 科尔| 拉孜县| 千阳县| 二手房| 胶州市| 漳州市|