CountdownLatch和CyclicBarrier简单对比

对比 CountdownLatch
使用场景 某些任务等待直到另外一些任务都完成 某些任务完成后开始等待,等这些任务都完成后,它们才能进入继续执行
await()含义 当前线程等待,直到count为0 标识当前线程已完成;count-1.如果count不为0,则阻塞等待;如果count等于0,所有参与线程解除阻塞,执行在CyclicBarrier上定义的barrierAction.
同步状态维护 AbstractQueueSynchronizer RetreenLock&Condition
特有api countdown: count-1 非阻塞 reset: 重置count,进入下一轮, 所有等待中的线程结束阻塞抛异常
重用性 仅能使用一次 可重置,多次使用
参与角色 两种参与角色 一种await阻塞等待,另外一种countdown 仅一种参与角色, 既是await又是countdown
latch-barrier.png

Latch演示代码

/**
 * CountdownLatch演示
 * count初始为3,
 * 线程t1,t2,t3各自完成一项耗时任务(以sleep模拟),并在执行结束后countdown
 * 主线程await等待
 *
 * @author alonwang
 * @date 2020/11/30 7:55 上午
 */
public class LatchDemo {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(3);
        Runnable r = () -> {
            //执行一项耗时任务
            try {
                Thread.sleep(new Random().nextInt(3000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "执行完毕...");
            latch.countDown();

        };
        new Thread(r, "t1").start();
        new Thread(r, "t2").start();
        new Thread(r, "t3").start();
        latch.await();
        System.out.println("主线程执行完毕 ...");
    }
}

//output

CyclicBarrier演示代码

/**
 * 启动两个线程,各自进行一个耗时操作,完成后await.
 * 两个线程都到达此阶段时,触发预先设定的barrierAction
 *
 * @author alonwang
 * @date 2020/11/30 8:04 上午
 */
public class CyclicBarrierDemo {
    public static void main(String[] args) throws InterruptedException {
        CyclicBarrier barrier = new CyclicBarrier(2, () -> System.out.println("执行barrierAction..."));
        Runnable runnable = () -> {
            try {
                Thread.sleep(new Random().nextInt(3000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "开始await");

            try {
                barrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+ "执行完毕");
        };
        new Thread(runnable, "t1").start();
        new Thread(runnable, "t2").start();
        Thread.sleep(5000);

    }
}
//output
t2开始await
t1开始await
执行barrierAction...
t2执行完毕
t1执行完毕

你可能感兴趣的:(CountdownLatch和CyclicBarrier简单对比)