吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JUC包中提供的幾個(gè)工具類

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-09-30 10:53 ? 次閱讀

JUC - 輔助類

JUC(java.util.concurrent)是在Java 5中引入的一個(gè)并發(fā)編程的擴(kuò)展庫,目的是為了更加方便、快捷和安全地實(shí)現(xiàn)并發(fā)編程。它提供了一系列的工具類、鎖、隊(duì)列以及原子類等來協(xié)調(diào)多線程之間的操作。

基于現(xiàn)代硬件不斷地發(fā)展,為了充分利用服務(wù)器資源,并發(fā)編程在我們的開發(fā)中已經(jīng)無處不在,今天主要了解下JUC包中提供的幾個(gè)工具類,讓我們?cè)诓l(fā)編程時(shí)提供助力。

簡(jiǎn)介

Java并發(fā)編程是一門復(fù)雜的技術(shù),其中有一些難點(diǎn)需要特別注意。以下是一些Java并發(fā)編程的難點(diǎn):

  • 線程安全:多線程執(zhí)行的代碼必須是線程安全的,否則會(huì)產(chǎn)生競(jìng)態(tài)條件和其他問題。
  • 死鎖:當(dāng)多個(gè)線程因?yàn)榛ハ嗟却渌€程釋放鎖而無法繼續(xù)執(zhí)行時(shí),就會(huì)產(chǎn)生死鎖。
  • 競(jìng)態(tài)條件:當(dāng)多個(gè)線程試圖同時(shí)訪問同一個(gè)共享資源時(shí),就會(huì)產(chǎn)生競(jìng)態(tài)條件。
  • 內(nèi)存可見性:多個(gè)線程同時(shí)訪問同一個(gè)變量時(shí),可能會(huì)產(chǎn)生內(nèi)存可見性問題,即一個(gè)線程對(duì)變量的修改不會(huì)立即被其他線程所感知。
  • 并發(fā)集合類:Java提供了一些并發(fā)集合類,如ConcurrentHashMap和ConcurrentLinkedQueue,但使用它們需要注意一些細(xì)節(jié)問題。
  • 線程池:線程池是Java并發(fā)編程中的一個(gè)重要概念,但線程池的使用也需要注意一些問題,如線程池大小、任務(wù)隊(duì)列類型等。
  • CAS操作:Java提供了CAS(Compare-And-Swap)操作,可以用于實(shí)現(xiàn)非阻塞算法,但使用CAS操作需要非常小心,以免產(chǎn)生ABA問題等。

工具類

  • CountDownLatch
    CountDownLatch是一個(gè)同步輔助類,使用一個(gè)給定數(shù)量的計(jì)數(shù)器,當(dāng)該計(jì)數(shù)器不為0時(shí),將程序阻塞在wait()處,當(dāng)線程執(zhí)行完成后通過調(diào)用countDown()使計(jì)數(shù)器減一, 直到計(jì)數(shù)器為0后才會(huì)繼續(xù)執(zhí)行后續(xù)代碼。 主要實(shí)現(xiàn)某個(gè)任務(wù)依賴其他一個(gè)或多個(gè)異步任務(wù)的執(zhí)行結(jié)果的場(chǎng)景

核心方法:

/**
 * 定義計(jì)數(shù)器數(shù)量,用于定義多少個(gè)執(zhí)行線程
 */
public CountDownLatch(int count);
/**
 * 阻塞方法,直到計(jì)數(shù)器為0時(shí)才會(huì)繼續(xù)執(zhí)行后續(xù)代碼
 */
public void await();
/**
 * 每次調(diào)用改方法,則計(jì)數(shù)器減一
 */
public void countDown();
  • CyclicBarrier
    CyclicBarrier內(nèi)部同樣定義了計(jì)數(shù)器,只不過每當(dāng)有線程執(zhí)行完后改計(jì)數(shù)器加一,直至達(dá)到定義數(shù)量后,執(zhí)行定義的回調(diào)函數(shù)與await()后續(xù)代碼。 與CountDownLatch相比,CyclicBarrier會(huì)對(duì)子任務(wù)阻塞,而CountDownLatch則阻塞主任務(wù);另外CyclicBarrier可以重復(fù)使用。 主要實(shí)現(xiàn)某個(gè)回調(diào)函數(shù)在一個(gè)或多個(gè)線程執(zhí)行完成后觸發(fā)的情形

核心方法:

/**
 * 定義計(jì)數(shù)器數(shù)量與回調(diào)函數(shù)
 */
public CyclicBarrier(int parties, Runnable barrierAction);
/**
 * 阻塞方法,當(dāng)有線程執(zhí)行到則計(jì)數(shù)器加一,等到達(dá)到目標(biāo)數(shù)后才會(huì)繼續(xù)后續(xù)代碼
 */
public int await();
/**
 * 通過該方法可以實(shí)現(xiàn)計(jì)數(shù)器的重置
 */
public void reset();
  • Semaphore
    信號(hào)量通常用于限制可以訪問某些(物理或邏輯)資源的線程數(shù)。 適用于有限資源數(shù)量的控制

核心方法:

/**
 * 定義許可數(shù)量
 */
public Semaphore(int permits);
/**
 * 申請(qǐng)?jiān)S可,改方法會(huì)阻塞程序
 */
public void acquire();
/**
 * 釋放許可
 */
public void release();

示例

CountDownLatch的使用場(chǎng)景

CountDownLatch是Java并發(fā)包中的一個(gè)工具類,它可以實(shí)現(xiàn)線程之間的協(xié)作。具體來說,CountDownLatch可以讓一個(gè)線程等待多個(gè)線程執(zhí)行完畢,再繼續(xù)執(zhí)行。CountDownLatch常用于以下場(chǎng)景:

  1. 主線程等待多個(gè)子線程執(zhí)行完畢。
  2. 多個(gè)子線程等待某個(gè)共同任務(wù)的完成。
  3. 模擬并發(fā)請(qǐng)求,等待所有請(qǐng)求都響應(yīng)完畢再進(jìn)行下一步操作。
  4. 統(tǒng)計(jì)多個(gè)線程執(zhí)行的時(shí)間。
@Test
    public void test() throws InterruptedException {
        int count = 10;
        CountDownLatch countDownLatch = new CountDownLatch(count);
        IntStream.range(0,count).forEach(i- >{
            new Thread(()- >{
                System.out.println( "執(zhí)行線程:"+ i );
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                countDownLatch.countDown();
            }).start();
        });

        countDownLatch.await();

        System.out.println("線程執(zhí)行完成");
    }

CyclicBarrier的使用場(chǎng)景

它允許多個(gè)線程在某個(gè)屏障處等待,直到所有線程都到達(dá)該屏障時(shí)才會(huì)繼續(xù)執(zhí)行。

CyclicBarrier 適用于一組線程需要相互等待,直到所有線程都完成某個(gè)任務(wù)后才能繼續(xù)執(zhí)行下一步操作的場(chǎng)景。例如,一個(gè)大型的計(jì)算任務(wù)可以被分成多個(gè)子任務(wù), 每個(gè)子任務(wù)由一個(gè)線程執(zhí)行。當(dāng)所有子任務(wù)完成后,這些線程需要等待,直到所有子任務(wù)都完成,然后再執(zhí)行下一步操作。

另外,CyclicBarrier 還可以用于優(yōu)化代碼性能。例如,當(dāng)我們需要等待多個(gè)線程都完成某項(xiàng)工作后,才能進(jìn)行下一步操作。此時(shí),我們可以使用 CyclicBarrier 來實(shí)現(xiàn)等待, 而不是使用 Thread.sleep() 方法等待一段時(shí)間。這樣可以避免無謂的等待時(shí)間,提高代碼效率。

@Test
    public void test() {
        int count = 10;
        AtomicBoolean finish = new AtomicBoolean(false);
        CyclicBarrier cyclicBarrier = new CyclicBarrier(count, ()- >{
            System.out.println("線程執(zhí)行完成");
            finish.set(true);
        });

        IntStream.range(0,count).forEach(i- >{
            new Thread(()- >{
                System.out.println( "執(zhí)行線程:"+ i );
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                } catch (BrokenBarrierException e) {
                    throw new RuntimeException(e);
                }
            }).start();
        });

        while (!finish.get()){}
    }

Semaphore的使用場(chǎng)景

它可以控制同時(shí)訪問某個(gè)共享資源的線程數(shù)量。常用于限制同時(shí)訪問某個(gè)資源的線程數(shù)量,例如數(shù)據(jù)庫連接池、線程池等。

  1. 控制并發(fā)線程數(shù):Semaphore可以限制并發(fā)線程數(shù),從而控制系統(tǒng)資源的使用情況。
  2. 控制訪問資源數(shù):Semaphore可以控制同時(shí)訪問某個(gè)資源的線程數(shù)量,例如數(shù)據(jù)庫連接池,限制連接數(shù)。
  3. 實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模型:Semaphore可以與阻塞隊(duì)列一起使用,實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模型,控制生產(chǎn)者和消費(fèi)者的數(shù)量。
  4. 多個(gè)線程間的協(xié)作:Semaphore可以用于多個(gè)線程之間的協(xié)作,例如某個(gè)線程需要等待某些條件滿足后才能繼續(xù)執(zhí)行,可以使用Semaphore來實(shí)現(xiàn)等待和喚醒操作。
@Test
    public void test() {
        int count = 10;

        Semaphore semaphore = new Semaphore(3);

        IntStream.range(0,count).forEach(i- >{
            new Thread(()- >{
                try {
                    semaphore.acquire();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

                System.out.println( "執(zhí)行線程:"+ i );

                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

                semaphore.release();
            }).start();
        });

        while (true){}
    }

結(jié)束語

涉及到線程的開發(fā)都伴隨著復(fù)雜性,不管是在代碼調(diào)試上還是理解線程切換與安全性上,JUC提供的各種強(qiáng)大的工具類將并發(fā)編程的復(fù)雜性進(jìn)行了封裝,不管是在使用或是擴(kuò)展上,都能通過簡(jiǎn)單的幾行代碼實(shí)現(xiàn)多線程的各種協(xié)調(diào)工作。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9303

    瀏覽量

    86061
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2974

    瀏覽量

    105138
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    278

    瀏覽量

    20071
  • 工具
    +關(guān)注

    關(guān)注

    4

    文章

    314

    瀏覽量

    27911
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    報(bào)表生成與數(shù)據(jù)存儲(chǔ)是包含幾個(gè)工具包

    這個(gè)報(bào)表生成與數(shù)據(jù)存儲(chǔ)工具包需要把數(shù)據(jù)庫連接工具包,因特網(wǎng)工具包還有報(bào)告生成工具包都安裝上嗎
    發(fā)表于 03-26 11:29

    請(qǐng)大神幫忙告訴我下面幾個(gè)器件應(yīng)該下載那些工具包。

    求大神幫忙啊,我在做畢業(yè)設(shè)計(jì),但是有的工具找不到,估計(jì)是工具包沒有裝全。請(qǐng)大神幫忙告訴我下面幾個(gè)器件應(yīng)該下載那些工具包。跪求啊,沒幾天要中期檢查了。 help~
    發(fā)表于 04-20 16:12

    java開源工具包-Jodd框架

    Jodd是一個(gè)Java工具包和微型框架,Jodd 工具包含一些實(shí)用的工具和小型框架,增強(qiáng)了 JDK 提供很多強(qiáng)大的功能,可以幫助實(shí)現(xiàn)日常的
    發(fā)表于 03-19 16:13

    CODESYS軟件工具包的優(yōu)勢(shì)主要表現(xiàn)在哪幾個(gè)方面

    CODESYS軟件工具包是什么?CODESYS軟件工具包的優(yōu)勢(shì)主要表現(xiàn)在哪幾個(gè)方面?
    發(fā)表于 09-23 06:45

    請(qǐng)問CH9329發(fā)送絕對(duì)鼠標(biāo)數(shù)據(jù)范例中提示無效是為什么?

    您好,請(qǐng)問CH9329串口通信協(xié)議中關(guān)于發(fā)送絕對(duì)鼠標(biāo)數(shù)據(jù)的范例 (968,500)中提供的命令 發(fā)送無效,(100,100)的可以,請(qǐng)問是哪里有問題嗎?
    發(fā)表于 06-24 11:26

    能否請(qǐng)您提供Win10 IoT快速入門指南中提到的CFImager工具?

    我們將在 i.MX 8M Mini 上準(zhǔn)備 Win10 IoT Demo。 能否請(qǐng)您提供Win10 IoT 快速入門指南中提到的CFImager 工具?
    發(fā)表于 06-05 07:47

    固件工具包

    固件工具包 修改工具包 高興向大家公布這個(gè)信息! 首先介紹一下這個(gè)工具地用途: 1、修改固件 - 通過此工具能夠修改固件中絕大多數(shù)地信息及配置。 2、...
    發(fā)表于 03-16 14:49 ?71次下載

    MathWorks發(fā)布在MATLAB和Simulink中提供

    MathWorks發(fā)布在MATLAB和Simulink中提供高級(jí)信號(hào)處理的新工具 MathWorks面向使用MATLAB和Simulink設(shè)計(jì)高級(jí)信號(hào)處理和通信系統(tǒng)發(fā)布了重要的新功
    發(fā)表于 09-17 12:47 ?552次閱讀

    JAVA教程之從壓縮中提取文件

    JAVA教程之從壓縮中提取文件,很好的JAVA的資料,快來學(xué)習(xí)吧
    發(fā)表于 04-11 17:28 ?3次下載

    HT32系列微控制器USB設(shè)備開發(fā)工具包

    HT32 系列的 USB 設(shè)備開發(fā)工具包幾個(gè)部分組成,包括 USB 設(shè)備固件庫、范例和基于 Windows 的 UI 演示。它支持所有具有 USB 設(shè)備控制器 Holtek HT32 系列
    發(fā)表于 06-26 09:29 ?0次下載
    HT32系列微控制器USB設(shè)備開發(fā)<b class='flag-5'>工具包</b>

    使用NVIDIA QAT工具包實(shí)現(xiàn)TensorRT量化網(wǎng)絡(luò)的設(shè)計(jì)

      目前, TensorFlow 在其開源軟件 模型優(yōu)化工具包 中提供非對(duì)稱量化。他們的量化方法包括在所需層的輸出和權(quán)重(如果適用)處插入 QDQ 節(jié)點(diǎn),并提供完整模型或部分層類型的
    的頭像 發(fā)表于 06-21 16:54 ?4322次閱讀
    使用NVIDIA QAT<b class='flag-5'>工具包</b>實(shí)現(xiàn)TensorRT量化網(wǎng)絡(luò)的設(shè)計(jì)

    AQS的同步組件有哪些呢?

    AQS 的全稱為 Abstract Queued Synchronizer,是在 JUC(java.util.concurrent)下子中的。
    的頭像 發(fā)表于 03-16 09:42 ?524次閱讀

    OST中提取郵箱數(shù)據(jù)和重置丟失的WindowsServer 密碼的工具

    為 PST 文件格式。它配備智能并行處理技術(shù),可將郵箱恢復(fù)和轉(zhuǎn)換速度提高 4 倍。該軟件還提供了從無法訪問的 OST 中提取郵箱數(shù)據(jù)和重置丟失的 WindowsServer 密碼的工具。 在損壞的情況下恢復(fù)
    的頭像 發(fā)表于 06-24 11:58 ?1290次閱讀
    OST<b class='flag-5'>中提</b>取郵箱數(shù)據(jù)和重置丟失的WindowsServer 密碼的<b class='flag-5'>工具</b>

    CIM為VMware ESXi 7.0提供工具包

    電子發(fā)燒友網(wǎng)站提供《CIM為VMware ESXi 7.0提供工具包.zip》資料免費(fèi)下載
    發(fā)表于 07-28 11:26 ?2次下載
    CIM為VMware ESXi 7.0<b class='flag-5'>提供</b><b class='flag-5'>工具包</b>

    OneInstall工具包

    電子發(fā)燒友網(wǎng)站提供《OneInstall工具包.exe》資料免費(fèi)下載
    發(fā)表于 08-18 14:54 ?0次下載
    OneInstall<b class='flag-5'>工具包</b>
    全讯网hg9388.com| 星子县| 百家乐官网玩法| 大嘴棋牌官方下载| 百家乐策略大全| 澳门百家乐官网赌技巧| 威尼斯人娱乐网代理注| 大亨百家乐娱乐城| 网上百家乐怎么破解| 玩百家乐官网优博娱乐城| tt娱乐城官方网站| 百家乐波音平台有假吗| 百家乐追号工具| 大发888客户端下载| 下载百家乐棋牌大厅| 赌博百家乐趋势把握| 百家乐美食坊| 利博娱乐城| 百家乐官网长庄投注| 罗马百家乐娱乐城| 盐边县| 娱乐网百家乐官网的玩法技巧和规则 | 德州扑克 规则| 百家乐模拟投注器| 百家乐博娱乐网赌百家乐| 百家乐官网平注法是什么| 大发888投注鸿博博彩| 24山风水| 百家乐官网现场投注平台| 二八杠论坛| 百家乐庄闲机率| 和乐娱乐| 百家乐园云鼎娱乐平台| 百家乐官网牌九| 五指山市| 威尼斯人娱乐城求助| 风水罗盘24方位| 百家乐官网2珠路投注法| 大发888古怪猴子| 百家乐智能分析| 凱旋门百家乐官网的玩法技巧和规则 |