CyclicBarrier:人齐了,老司机就发车了!(2)

简介: CyclicBarrier:人齐了,老司机就发车了!(2)

CyclicBarrier VS CountDownLatch


CountDownLatch:一个或者多个线程,等待另外 N 个线程完成某个事情之后才能执行。

CountDownLatch 就像玩王者农药开局的加载一样,所有人要等待其他人都加载 100% 之后才能开始游戏。


微信图片_20220120172356.jpg


CyclicBrrier:N 个线程相互等待,直到有足够数量的线程都到达屏障点之后,之前等待的线程就可以继续执行了。


CyclicBrrier 就像老司机开车一样,如果车上还有空余的座位,那么所有人都得等着,直到座位被坐满之后,老司机才会发车。


微信图片_20220120172415.gif



CyclicBarrier使用


import java.util.Date;
import java.util.Random;
import java.util.concurrent.*;
publicclass CyclicBarrierExample {
    public static void main(String[] args) {
        // 创建 CyclicBarrier
        final CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new Runnable() {
            @Override
            public void run() {
                System.out.println("人满了,准备发车:" + new Date());
            }
        });
        // 线程调用的任务
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                // 生成随机数 1-3
                int randomNumber = new Random().nextInt(3) + 1;
                // 进入任务
                System.out.println(String.format("我是:%s 再走:%d 秒就到车站了,现在时间:%s",
                        Thread.currentThread().getName(), randomNumber, new Date()));
                try {
                    // 模拟执行
                    TimeUnit.SECONDS.sleep(randomNumber);
                    // 调用 CyclicBarrier
                    cyclicBarrier.await();
                    // 任务执行
                    System.out.println(String.format("线程:%s 上车,时间:%s",
                            Thread.currentThread().getName(), new Date()));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
        };
        // 创建线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(10);
        // 执行任务 1
        threadPool.submit(runnable);
        // 执行任务 2
        threadPool.submit(runnable);
        // 执行任务 3
        threadPool.submit(runnable);
        // 执行任务 4
        threadPool.submit(runnable);
        // 等待所有任务执行完终止线程池
        threadPool.shutdown();
    }
}
相关文章
|
2月前
|
监控 安全 Java
CompletableFuture探秘:解锁Java并发编程的新境界
CompletableFuture探秘:解锁Java并发编程的新境界
140 0
|
缓存 安全 Java
6. 多线程基础
对一个程序的运行状态, 以及在运行中所占用的资源(内存, CPU)的描述; 一个进程可以理解为一个程序; 但是反之, 一个程序就是一个进程, 这句话是错的。
71 0
6. 多线程基础
|
安全 Java 编译器
多线程基础(上)
多线程基础(上)
52 0
多线程基础(上)
|
Java 编译器 程序员
多线程基础(下)
多线程基础(下)
86 0
多线程基础(下)
|
算法 Java 调度
【多线程基础知识】
【多线程基础知识】
106 0
|
存储 缓存 安全
|
算法 Java 程序员
5千字详细讲解java并发编程的AQS
本文讲解AQS的组成,实现原理,应用,源码解析
5千字详细讲解java并发编程的AQS
|
安全 Java 调度
第8章 多线程基础
建立多线程基础,了解基本知识。
93 0
『死磕Java并发编程系列』并发编程工具类之CountDownLatch
『死磕Java并发编程系列』并发编程工具类之CountDownLatch
『死磕Java并发编程系列』并发编程工具类之CountDownLatch
|
Java 编译器 调度
多线程基础知识(中)
多线程基础知识(中)
70 0
多线程基础知识(中)