在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

JUC包中提供的幾個工具類

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

JUC - 輔助類

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

基于現代硬件不斷地發展,為了充分利用服務器資源,并發編程在我們的開發中已經無處不在,今天主要了解下JUC包中提供的幾個工具類,讓我們在并發編程時提供助力。

簡介

Java并發編程是一門復雜的技術,其中有一些難點需要特別注意。以下是一些Java并發編程的難點:

  • 線程安全:多線程執行的代碼必須是線程安全的,否則會產生競態條件和其他問題。
  • 死鎖:當多個線程因為互相等待其他線程釋放鎖而無法繼續執行時,就會產生死鎖。
  • 競態條件:當多個線程試圖同時訪問同一個共享資源時,就會產生競態條件。
  • 內存可見性:多個線程同時訪問同一個變量時,可能會產生內存可見性問題,即一個線程對變量的修改不會立即被其他線程所感知。
  • 并發集合類:Java提供了一些并發集合類,如ConcurrentHashMap和ConcurrentLinkedQueue,但使用它們需要注意一些細節問題。
  • 線程池:線程池是Java并發編程中的一個重要概念,但線程池的使用也需要注意一些問題,如線程池大小、任務隊列類型等。
  • CAS操作:Java提供了CAS(Compare-And-Swap)操作,可以用于實現非阻塞算法,但使用CAS操作需要非常小心,以免產生ABA問題等。

工具類

  • CountDownLatch
    CountDownLatch是一個同步輔助類,使用一個給定數量的計數器,當該計數器不為0時,將程序阻塞在wait()處,當線程執行完成后通過調用countDown()使計數器減一, 直到計數器為0后才會繼續執行后續代碼。 主要實現某個任務依賴其他一個或多個異步任務的執行結果的場景

核心方法:

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

核心方法:

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

核心方法:

/**
 * 定義許可數量
 */
public Semaphore(int permits);
/**
 * 申請許可,改方法會阻塞程序
 */
public void acquire();
/**
 * 釋放許可
 */
public void release();

示例

CountDownLatch的使用場景

CountDownLatch是Java并發包中的一個工具類,它可以實現線程之間的協作。具體來說,CountDownLatch可以讓一個線程等待多個線程執行完畢,再繼續執行。CountDownLatch常用于以下場景:

  1. 主線程等待多個子線程執行完畢。
  2. 多個子線程等待某個共同任務的完成。
  3. 模擬并發請求,等待所有請求都響應完畢再進行下一步操作。
  4. 統計多個線程執行的時間。
@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( "執行線程:"+ i );
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                countDownLatch.countDown();
            }).start();
        });

        countDownLatch.await();

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

CyclicBarrier的使用場景

它允許多個線程在某個屏障處等待,直到所有線程都到達該屏障時才會繼續執行。

CyclicBarrier 適用于一組線程需要相互等待,直到所有線程都完成某個任務后才能繼續執行下一步操作的場景。例如,一個大型的計算任務可以被分成多個子任務, 每個子任務由一個線程執行。當所有子任務完成后,這些線程需要等待,直到所有子任務都完成,然后再執行下一步操作。

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

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

        IntStream.range(0,count).forEach(i- >{
            new Thread(()- >{
                System.out.println( "執行線程:"+ 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的使用場景

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

  1. 控制并發線程數:Semaphore可以限制并發線程數,從而控制系統資源的使用情況。
  2. 控制訪問資源數:Semaphore可以控制同時訪問某個資源的線程數量,例如數據庫連接池,限制連接數。
  3. 實現生產者-消費者模型:Semaphore可以與阻塞隊列一起使用,實現生產者-消費者模型,控制生產者和消費者的數量。
  4. 多個線程間的協作:Semaphore可以用于多個線程之間的協作,例如某個線程需要等待某些條件滿足后才能繼續執行,可以使用Semaphore來實現等待和喚醒操作。
@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( "執行線程:"+ i );

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

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

        while (true){}
    }

結束語

涉及到線程的開發都伴隨著復雜性,不管是在代碼調試上還是理解線程切換與安全性上,JUC提供的各種強大的工具類將并發編程的復雜性進行了封裝,不管是在使用或是擴展上,都能通過簡單的幾行代碼實現多線程的各種協調工作。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    9304

    瀏覽量

    86061
  • JAVA
    +關注

    關注

    19

    文章

    2974

    瀏覽量

    105145
  • 多線程
    +關注

    關注

    0

    文章

    278

    瀏覽量

    20074
  • 工具
    +關注

    關注

    4

    文章

    314

    瀏覽量

    27911
收藏 人收藏

    評論

    相關推薦

    報表生成與數據存儲是包含幾個工具包

    這個報表生成與數據存儲工具包需要把數據庫連接工具包,因特網工具包還有報告生成工具包都安裝上嗎
    發表于 03-26 11:29

    請大神幫忙告訴我下面幾個器件應該下載那些工具包

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

    java開源工具包-Jodd框架

    Jodd是一個Java工具包和微型框架,Jodd 工具包含一些實用的工具和小型框架,增強了 JDK 提供很多強大的功能,可以幫助實現日常的
    發表于 03-19 16:13

    CODESYS軟件工具包的優勢主要表現在哪幾個方面

    CODESYS軟件工具包是什么?CODESYS軟件工具包的優勢主要表現在哪幾個方面?
    發表于 09-23 06:45

    請問CH9329發送絕對鼠標數據范例中提示無效是為什么?

    您好,請問CH9329串口通信協議中關于發送絕對鼠標數據的范例 (968,500)中提供的命令 發送無效,(100,100)的可以,請問是哪里有問題嗎?
    發表于 06-24 11:26

    能否請您提供Win10 IoT快速入門指南中提到的CFImager工具

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

    固件工具包

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

    MathWorks發布在MATLAB和Simulink中提供

    MathWorks發布在MATLAB和Simulink中提供高級信號處理的新工具 MathWorks面向使用MATLAB和Simulink設計高級信號處理和通信系統發布了重要的新功
    發表于 09-17 12:47 ?552次閱讀

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

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

    HT32系列微控制器USB設備開發工具包

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

    使用NVIDIA QAT工具包實現TensorRT量化網絡的設計

      目前, TensorFlow 在其開源軟件 模型優化工具包 中提供非對稱量化。他們的量化方法包括在所需層的輸出和權重(如果適用)處插入 QDQ 節點,并提供完整模型或部分層類型的
    的頭像 發表于 06-21 16:54 ?4324次閱讀
    使用NVIDIA QAT<b class='flag-5'>工具包</b>實現TensorRT量化網絡的設計

    AQS的同步組件有哪些呢?

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

    OST中提取郵箱數據和重置丟失的WindowsServer 密碼的工具

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

    CIM為VMware ESXi 7.0提供工具包

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

    OneInstall工具包

    電子發燒友網站提供《OneInstall工具包.exe》資料免費下載
    發表于 08-18 14:54 ?0次下載
    OneInstall<b class='flag-5'>工具包</b>
    主站蜘蛛池模板: 欧美午夜一区 | 国产真实乱在线更新 | 福利视频入口 | 国产美女亚洲精品久久久久久 | 四虎国产永久在线精品免费观看 | 国产天天射| 国模吧双双大尺度炮交gogo | 天天爽夜夜 | 免费观看的黄色网址 | 大尺度在线 | 日本a级特黄三级三级三级 日本边添边爱边摸边做边爱 | 国产婷婷综合在线精品尤物 | 欧美成人三级伦在线观看 | 亚洲精品二区中文字幕 | 性欧美在线 | 欧美激情综合亚洲五月蜜桃 | 免费人成网站 | 久久www成人看片 | 午夜特级毛片 | 五月天丁香婷婷综合 | 永久免费人成网ww555kkk手机 | 久久九九国产精品怡红院 | 欧美一级特黄aa大片视频 | 九色欧美 | 一区二区三区在线观看视频 | 色网站在线 | 我要看黄色一级毛片 | 四虎影院在线免费播放 | 亚洲男人的天堂在线播放 | 天天综合色天天综合 | 久久奇米 | 男人的天堂黄色 | 西西人体大胆午夜gog0 | 午夜在线视频观看版 | 国产成人毛片亚洲精品不卡 | 5060午夜一级| 国产一级淫| 国产大片黄在线看免费 | 天天摸天天躁天天添天天爽 | 成年全黄大色大黄 | 亚洲精品系列 |