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

Java并發(fā)工具類CountDownLatch CyclicBarrier使用詳解

 更新時間:2023年06月01日 14:16:13   作者:移動安全星球  
這篇文章主要為大家介紹了Java并發(fā)工具類CountDownLatch CyclicBarrier使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

CountDownLatch

CountDownLatch是一個同步輔助類,它允許一個或多個線程等待,直到其他線程完成一組操作。CountDownLatch有一個計數(shù)器,當(dāng)計數(shù)器減為0時,等待的線程將被喚醒。計數(shù)器只能減少,不能增加。

示例:使用CountDownLatch等待所有線程完成任務(wù)

假設(shè)我們有一個任務(wù)需要三個子任務(wù)完成,我們可以使用CountDownLatch來等待所有子任務(wù)完成。

import java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(3);
        for (int i = 1; i <= 3; i++) {
            final int taskNumber = i;
            new Thread(() -> {
                System.out.println("Task " + taskNumber + " started");
                try {
                    Thread.sleep(1000 * taskNumber);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Task " + taskNumber + " completed");
                latch.countDown();
            }).start();
        }
        System.out.println("Waiting for all tasks to complete...");
        latch.await();
        System.out.println("All tasks completed");
    }
}

在這個示例中,我們創(chuàng)建了一個CountDownLatch并設(shè)置初始計數(shù)器為3。每個子任務(wù)完成后,調(diào)用latch.countDown()減少計數(shù)器。主線程調(diào)用latch.await()等待所有子任務(wù)完成。

CyclicBarrier

CyclicBarrier是一個同步輔助類,它允許一組線程相互等待,直到所有線程都準(zhǔn)備好繼續(xù)執(zhí)行。當(dāng)所有線程都到達屏障點時,屏障將打開。CyclicBarrier可以重復(fù)使用。

示例:使用CyclicBarrier同步多個線程

假設(shè)我們有三個線程需要在某個點同步,我們可以使用CyclicBarrier實現(xiàn)這個目的。

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
    public static void main(String[] args) {
        CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("All threads are ready to proceed"));
        for (int i = 1; i <= 3; i++) {
            final int taskNumber = i;
            new Thread(() -> {
                System.out.println("Task " + taskNumber + " is ready");
                try {
                    barrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("Task " + taskNumber + " is proceeding");
            }).start();
        }
    }
}

在這個示例中,我們創(chuàng)建了一個CyclicBarrier并設(shè)置參與者數(shù)量為3。每個線程在準(zhǔn)備好繼續(xù)執(zhí)行之前調(diào)用barrier.await()。當(dāng)所有線程都準(zhǔn)備好時,屏障將打開,所有線程將繼續(xù)執(zhí)行。

Semaphore

Semaphore是一個計數(shù)信號量,它維護了一個許可集。線程可以請求許可,如果有可用的許可,線程將獲得許可并繼續(xù)執(zhí)行。否則,線程將阻塞,直到有可用的許可。許可可以由任何線程釋放。Semaphore可用于實現(xiàn)資源池、限制并發(fā)訪問等。

示例:使用Semaphore限制并發(fā)訪問

假設(shè)我們有一個只能同時處理三個請求的服務(wù)器,我們可以使用Semaphore來實現(xiàn)并發(fā)訪問限制。

import java.util.concurrent.Semaphore;
public class SemaphoreExample {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(3);
        for (int i = 1; i <= 10; i++)            final int clientNumber = i;
            new Thread(() -> {
                try {
                    System.out.println("Client " + clientNumber + " is trying to connect");
                    semaphore.acquire();
                    System.out.println("Client " + clientNumber + " is connected");
                    Thread.sleep(2000);
                    System.out.println("Client " + clientNumber + " is disconnected");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    semaphore.release();
                }
            }).start();
        }
    }
}

在這個示例中,我們創(chuàng)建了一個Semaphore并設(shè)置初始許可數(shù)量為3。每個客戶端線程在連接服務(wù)器之前調(diào)用semaphore.acquire()請求許可。當(dāng)許可可用時,線程將獲得許可并繼續(xù)執(zhí)行。線程完成后,調(diào)用semaphore.release()釋放許可。

Exchanger

Exchanger是一個同步輔助類,它允許兩個線程在一個臨界點交換數(shù)據(jù)。當(dāng)兩個線程都到達交換點時,它們將交換數(shù)據(jù)。Exchanger可以用于遺傳算法、管道設(shè)計等。

示例:使用Exchanger交換數(shù)據(jù)

假設(shè)我們有兩個線程,一個生成數(shù)據(jù),另一個處理數(shù)據(jù)。我們可以使用Exchanger在這兩個線程之間交換數(shù)據(jù)。

import java.util.concurrent.Exchanger;
public class ExchangerExample {
    public static void main(String[] args) {
        Exchanger<String> exchanger = new Exchanger<>();
        new Thread(() -> {
            try {
                String data = "Data from producer";
                System.out.println("Producer is sending: " + data);
                String receivedData = exchanger.exchange(data);
                System.out.println("Producer received: " + receivedData);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        new Thread(() -> {
            try {
                String data = "Data from consumer";
                System.out.println("Consumer is sending: " + data);
                String receivedData = exchanger.exchange(data);
                System.out.println("Consumer received: " + receivedData);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

在這個示例中,我們創(chuàng)建了一個Exchanger。生產(chǎn)者和消費者線程在交換數(shù)據(jù)前調(diào)用exchanger.exchange(data)。當(dāng)兩個線程都到達交換點時,它們將交換數(shù)據(jù)。

Phaser

Phaser是一個靈活的同步輔助類,它允許一組線程相互等待,直到所有線程都準(zhǔn)備好繼續(xù)執(zhí)行。與CyclicBarrier類似,但Phaser更加靈活,可以動態(tài)調(diào)整參與者數(shù)量和支持多個階段。

示例:使用Phaser同步多個線程

假設(shè)我們有三個線程需要在某個點同步,我們可以使用Phaser實現(xiàn)這個目的。

import java.util.concurrent.Phaser;
public class PhaserExample {
    public static void main(String[] args) {
        Phaser phaser = new Phaser(3);
        for (int i = 1; i <= 3; i++) {
            final int taskNumber = i;
            new Thread(() -> {
                System.out.println("Task " + taskNumber + " is ready");
                phaser.arriveAndAwaitAdvance();
                System.out.println("Task " + taskNumber + " is proceeding");
            }).start();
        }
    }
}

在這個示例中,我們創(chuàng)建了一個Phaser并設(shè)置參與者數(shù)量為3。每個線程在準(zhǔn)備好繼續(xù)執(zhí)行之前調(diào)用phaser.arriveAndAwaitAdvance()。當(dāng)所有線程都準(zhǔn)備好時,屏障將打開,所有線程將繼續(xù)執(zhí)行。

這些并發(fā)工具類為Java多線程編程提供了強大的支持,幫助我們更輕松地實現(xiàn)各種同步和并發(fā)場景。希望這些示例能幫助你理解并掌握這些工具類的用法。

以上就是Java并發(fā)工具類CountDownLatch CyclicBarrier使用詳解的詳細內(nèi)容,更多關(guān)于Java并發(fā)工具類的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 分享JPA的幾個小技巧

    分享JPA的幾個小技巧

    這篇文章主要分享了JPA的幾個小技巧,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • SpringBoot實現(xiàn)token登錄的示例代碼

    SpringBoot實現(xiàn)token登錄的示例代碼

    在進行登錄驗證時,我們需要session或cookie會話進行驗證,當(dāng)我們脫離瀏覽器用app等向服務(wù)端發(fā)請求就沒有session和cookie機制,這時我們就需要使用token令牌進行登錄驗證,本文就詳細的介紹一下,感興趣的可以了解一下
    2022-03-03
  • 使用Spring MVC實現(xiàn)雙向數(shù)據(jù)綁定

    使用Spring MVC實現(xiàn)雙向數(shù)據(jù)綁定

    Spring MVC是一個廣泛用于構(gòu)建Java Web應(yīng)用程序的框架,它提供了眾多功能,包括雙向數(shù)據(jù)綁定,在這篇文章中,我們將向Java新手介紹如何使用Spring MVC實現(xiàn)雙向數(shù)據(jù)綁定,以及為什么這個特性如此重要,需要的朋友可以參考下
    2024-01-01
  • 前端如何調(diào)用后端接口進行數(shù)據(jù)交互詳解(axios和SpringBoot)

    前端如何調(diào)用后端接口進行數(shù)據(jù)交互詳解(axios和SpringBoot)

    一般來講前端不會給后端接口,而是后端給前端接口的情況比較普遍,下面這篇文章主要給大家介紹了關(guān)于前端如何調(diào)用后端接口進行數(shù)據(jù)交互的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • Spring?MVC的三種異常處理方式實例詳解

    Spring?MVC的三種異常處理方式實例詳解

    在SpringMVC 中,不管是編譯異常還是運行時異常,都可以最終由 SpringMVC提供的異常處理器進行統(tǒng)一處理,這樣就避免了隨時隨地捕獲處理的繁瑣性,這篇文章主要介紹了Spring?MVC的三種異常處理方式?,需要的朋友可以參考下
    2024-01-01
  • 如何優(yōu)雅的實現(xiàn)將Collection轉(zhuǎn)為Map

    如何優(yōu)雅的實現(xiàn)將Collection轉(zhuǎn)為Map

    這篇文章主要介紹了如何優(yōu)雅的實現(xiàn)將Collection轉(zhuǎn)為Map,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • javacv ffmpeg使用原生ffmpeg命令方式

    javacv ffmpeg使用原生ffmpeg命令方式

    在使用javacv集成ffmpeg進行視頻處理時,發(fā)現(xiàn)使用ffmpeg-6.0-1.5.9版本出現(xiàn)原生命令執(zhí)行失敗的問題,通過降級至ffmpeg-5.1.2-1.5.8版本,問題得到解決,此外,ffprobe可以用于獲取視頻屬性,需確保視頻片段屬性一致性
    2024-11-11
  • Java的二叉樹排序以及遍歷文件展示文本格式的文件樹

    Java的二叉樹排序以及遍歷文件展示文本格式的文件樹

    這篇文章主要介紹了Java的二叉樹排序以及遍歷文件展示文本格式的文件樹,是對二叉樹結(jié)構(gòu)學(xué)習(xí)的兩個很好的實踐,需要的朋友可以參考下
    2015-11-11
  • 深入探討Java多線程中的volatile變量

    深入探討Java多線程中的volatile變量

    這篇文章主要為大家詳細并深入的探討Java多線程中的volatile變量,volatile用來確保將變量的更新操作通知到其他線程,保證了新值能立即同步到主內(nèi)存,以及每次使用前立即從主內(nèi)存刷新,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Spring-全面詳解(學(xué)習(xí)總結(jié))

    Spring-全面詳解(學(xué)習(xí)總結(jié))

    這篇文章主要介紹了詳解Spring框架入門,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望能給你帶來幫助
    2021-07-07

最新評論

余姚市| 界首市| 亚东县| 阿坝县| 南充市| 开鲁县| 鹿邑县| 景宁| 武鸣县| 寻甸| 亳州市| 凤冈县| 石景山区| 谢通门县| 云南省| 荃湾区| 新沂市| 桦川县| 广德县| 富裕县| 绥化市| 克拉玛依市| 弥渡县| 阳西县| 乳山市| 阿拉善右旗| 桓仁| 青海省| 伊宁市| 八宿县| 通城县| 桓仁| 梧州市| 定远县| 余庆县| 信丰县| 水城县| 凤城市| 永靖县| 南京市| 十堰市|