博客
关于我
CountDownLatch和CyclicBarrier并发容器
阅读量:207 次
发布时间:2019-02-28

本文共 2685 字,大约阅读时间需要 8 分钟。

Java多线程并发执行CountDownLatch CyclicBarrier应用

CountDownLatch和CyclicBarrier是Java中用于多线程并发执行和结果汇总的重要工具。它们在不同的场景下发挥着关键作用。本文将从功能、使用场景以及示例代码方面深入探讨这两种工具的特点和应用方法。

CountDownLatch的主要作用是让一个线程等待其他线程完成特定操作。它通过countDown()方法标记操作完成,而await()方法则让等待线程在所有countDown()完成后继续执行。与CyclicBarrier不同,CountDownLatch允许多个线程独立执行,主线程只需等待所有线程完成即可继续后续操作。

CyclicBarrier则更适用于所有线程必须同时等待的情况。它要求所有参与线程完成操作后才能解除阻塞,通常用于多阶段任务流程。例如,一个任务可能需要多个阶段,每个阶段由不同的线程处理,CyclicBarrier可以确保所有阶段同时完成后进入下一阶段。

以下是两个工具的典型使用场景:

  • CountDownLatch适用于需要单个线程等待多个线程完成后续操作。例如,数据聚合任务中,多个线程分别处理不同数据块,主线程等待所有线程完成后进行最终汇总。

  • CyclicBarrier适用于多个线程需要同时执行相同操作。例如,资源竞争场景中,多个线程等待资源释放后共同执行任务。

  • 以下示例展示了CountDownLatch和CyclicBarrier的实际应用:

    CountDownLatch示例:

    import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CountdownLatchTest {    private final static int THREAD_NUM = 10;    public static void main(String[] args) throws InterruptedException {        CountDownLatch lock = new CountDownLatch(THREAD_NUM);        ExecutorService exec = Executors.newCachedThreadPool();        for (int i = 0; i < THREAD_NUM; i++) {            exec.submit(new Runnable() {                @Override                public void run() {                    System.out.println("Thread-" + i + "完成任务");                    lock.countDown();                }            });        }        lock.await();        System.out.println("所有线程完成,进入汇总阶段");        exec.shutdown();    }}

    CyclicBarrier示例:

    import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CyclicBarrierTest {    private final static int THREAD_NUM = 10;    public static void main(String[] args) throws Exception {        CyclicBarrier barrier = new CyclicBarrier(THREAD_NUM, new Runnable() {            @Override            public void run() {                System.out.println("所有线程完成,进入下一阶段");            }        });        ExecutorService exec = Executors.newCachedThreadPool();        for (int i = 0; i < THREAD_NUM; i++) {            exec.submit(new Runnable() {                @Override                public void run() {                    try {                        System.out.println("Task-" + i + "完成");                        barrier.await();                    } catch (InterruptedException | BrokenBarrierException e) {                        e.printStackTrace();                    }                }            });        }        exec.shutdown();    }}

    总结来说,CountDownLatch和CyclicBarrier是Java多线程编程中强大的工具。CountDownLatch适用于主线程需要等待多个独立线程完成任务,而CyclicBarrier则用于所有线程必须同时完成当前阶段才能进入下一阶段。在实际应用中,选择合适的工具取决于任务的并发需求和阶段划分方式。

    转载地址:http://pgqs.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现字符串复制功能(附完整源码)
    查看>>
    Objective-C实现字符串是否回文Palindrome算法 (附完整源码)
    查看>>
    Objective-C实现字符串查找子串(附完整源码)
    查看>>
    Objective-C实现完整的ComplexNumber复数类(附完整源码)
    查看>>
    Objective-C实现完整的matrix矩阵类(附完整源码)
    查看>>
    Objective-C实现实现rabin karp算法(附完整源码)
    查看>>
    Objective-C实现对图像进行色调处理算法(附完整源码)
    查看>>
    Objective-C实现对称矩阵压缩存储(附完整源码)
    查看>>
    Objective-C实现寻找欧拉路径/回路(附完整源码)
    查看>>
    Objective-C实现导弹跟踪算法(附完整源码)
    查看>>
    Objective-C实现将 b 除以模 n 的有效算法(附完整源码)
    查看>>
    Objective-C实现将 base64 字符串转换为字节数组算法(附完整源码)
    查看>>
    Objective-C实现将位转换为浮点数bitsToFloat算法(附完整源码)
    查看>>
    Objective-C实现将列表向右旋转 k 个位置算法(附完整源码)
    查看>>
    Objective-C实现将字符串中大写字母转换为小写字母(附完整源码)
    查看>>
    Objective-C实现将字符串从一个基转换为另一个基算法(附完整源码)
    查看>>
    Objective-C实现将字节数组转换为 base64 编码算法(附完整源码)
    查看>>
    Objective-C实现将彩色图像转换为负片算法(附完整源码)
    查看>>
    Objective-C实现将无符号整数n变成成d进制表示的字符串s(附完整源码)
    查看>>
    Objective-C实现将给定的 utf-8 字符串编码为 base-16算法(附完整源码)
    查看>>