欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

CountDownLatch

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

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

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

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ù)器為3。每個子任務完成后,調用latch.countDown()減少計數(shù)器。主線程調用latch.await()等待所有子任務完成。

CyclicBarrier

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

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

假設我們有三個線程需要在某個點同步,我們可以使用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ù)量為3。每個線程在準備好繼續(xù)執(zhí)行之前調用barrier.await()。當所有線程都準備好時,屏障將打開,所有線程將繼續(xù)執(zhí)行。

Semaphore

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

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

假設我們有一個只能同時處理三個請求的服務器,我們可以使用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ù)量為3。每個客戶端線程在連接服務器之前調用semaphore.acquire()請求許可。當許可可用時,線程將獲得許可并繼續(xù)執(zhí)行。線程完成后,調用semaphore.release()釋放許可。

Exchanger

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

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

假設我們有兩個線程,一個生成數(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ù)前調用exchanger.exchange(data)。當兩個線程都到達交換點時,它們將交換數(shù)據(jù)。

Phaser

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

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

假設我們有三個線程需要在某個點同步,我們可以使用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ù)量為3。每個線程在準備好繼續(xù)執(zhí)行之前調用phaser.arriveAndAwaitAdvance()。當所有線程都準備好時,屏障將打開,所有線程將繼續(xù)執(zhí)行。

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

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

相關文章

  • SparkSQL開窗函數(shù)分析使用示例

    SparkSQL開窗函數(shù)分析使用示例

    開窗函數(shù)的引入是為了既顯示聚集前的數(shù)據(jù),又顯示聚集后的數(shù)據(jù)。即在每一行的最后一列添加聚合函數(shù)的結果。開窗用于為行定義一個窗口,它對一組值進行操作,不需要使用 GROUP BY 子句對數(shù)據(jù)進行分組,能夠在同一行中同時返回基礎行的列和聚合列
    2023-01-01
  • SpringBoot可視化接口開發(fā)工具magic-api的簡單使用教程

    SpringBoot可視化接口開發(fā)工具magic-api的簡單使用教程

    作為Java后端開發(fā),平時開發(fā)API接口的時候經(jīng)常需要定義Controller、Service、Dao、Mapper、XML、VO等Java對象。有沒有什么辦法可以讓我們不寫這些代碼,直接操作數(shù)據(jù)庫生成API接口呢?今天給大家推薦一款工具magic-api,來幫我們實現(xiàn)這個小目標!
    2021-06-06
  • SpringBoot整合rockerMQ消息隊列詳解

    SpringBoot整合rockerMQ消息隊列詳解

    今天和大家一起深入生產(chǎn)級別消息中間件 - RocketMQ 的內核實現(xiàn),來看看真正落地能支撐萬億級消息容量、低延遲的消息隊列到底是如何設計的。我會先介紹整體的架構設計,然后再深入各核心模塊的詳細設計、核心流程的剖析
    2022-07-07
  • java刪除文件和文件夾具體實現(xiàn)

    java刪除文件和文件夾具體實現(xiàn)

    這篇文章介紹了java刪除文件和文件夾具體實現(xiàn),有需要的朋友可以參考一下
    2013-10-10
  • Java實現(xiàn)的獲取和判斷文件頭信息工具類用法示例

    Java實現(xiàn)的獲取和判斷文件頭信息工具類用法示例

    這篇文章主要介紹了Java實現(xiàn)的獲取和判斷文件頭信息工具類,結合實例形式分析了Java針對文件讀取及頭信息判斷相關操作技巧,需要的朋友可以參考下
    2017-11-11
  • Oracle + Mybatis實現(xiàn)批量插入、更新和刪除示例代碼

    Oracle + Mybatis實現(xiàn)批量插入、更新和刪除示例代碼

    利用MyBatis動態(tài)SQL的特性,我們可以做一些批量的操作,下面這篇文章主要給大家介紹了關于Oracle + Mybatis實現(xiàn)批量插入、更新和刪除的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2018-01-01
  • 利用solr實現(xiàn)商品的搜索功能(實例講解)

    利用solr實現(xiàn)商品的搜索功能(實例講解)

    下面小編就為大家分享一篇利用solr實現(xiàn)商品的搜索功能,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • Mybatis實現(xiàn)Mapper動態(tài)代理方式詳解

    Mybatis實現(xiàn)Mapper動態(tài)代理方式詳解

    這篇文章主要為大家詳細介紹了Mybatis實現(xiàn)Mapper動態(tài)代理方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • SpringMVC中的HandlerMapping和HandlerAdapter詳解

    SpringMVC中的HandlerMapping和HandlerAdapter詳解

    這篇文章主要介紹了SpringMVC中的HandlerMapping和HandlerAdapter詳解,在Spring MVC中,HandlerMapping(處理器映射器)用于確定請求處理器對象,請求處理器可以是任何對象,只要它們使用了@Controller注解或注解@RequestMapping,需要的朋友可以參考下
    2023-08-08
  • Java基礎之數(shù)組的初始化過程

    Java基礎之數(shù)組的初始化過程

    Java數(shù)組分為靜態(tài)和動態(tài)初始化,靜態(tài)初始化中,程序員設定元素初始值,系統(tǒng)決定長度;動態(tài)初始化中,程序員設定長度,系統(tǒng)提供初始值,數(shù)組初始化后長度固定,存儲在堆內存中,數(shù)組變量在棧內存指向堆內存數(shù)組對象,基本類型數(shù)組存儲數(shù)據(jù)值,引用類型數(shù)組存儲對象引用
    2024-10-10

最新評論