CountDownLatch与CyclicBarrier区别

本文详细介绍了Java并发包中两种重要的工具类:CountDownLatch与CyclicBarrier。CountDownLatch用于实现一个线程等待多个线程完成任务后再继续执行;而CyclicBarrier则确保一组线程互相等待,直至所有线程达到屏障点后才一并继续执行。文章还通过实例演示了这两种工具的具体使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 CountDownLatch的用途

CountDownLatch类是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0时,await()方法会阻塞程序继续运行。CountDownLatch能够使一个线程等待其他线程完成各自的工作后再执行。

2 CyclicBarrier的用途

CyclicBarrier的字面意思是可循环使用的屏障。它要做的事情是让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所以被屏障拦截的线程才会继续干活。每个线程调用await方法告诉CyclicBarrier我已经到达屏障,然后当前线程被阻塞。

3 CountDownLatch与CyclicBarrier区别

1)       CountDownLatch:一个线程或者多个线程,等待另外N个线程完成某个事情之后才能执行。只有一个等待线程,其他N个线程都可以顺利执行完毕。

2)       CyclicBarrier:N个线程互相等待,任何一个线程完成之前,所有线程都必须等待。在最后一个未await之前,所有N个线程都不算完成,都处于阻塞状态。

4 附录

4.1 CountDownLatch 效果演示

package test;

 

import java.util.concurrent.CountDownLatch;

 

public classCountLatchTest {

    public static void main(String[] args){

        CountDownLatchobjectCountDownLatch = newCountDownLatch(3);

        Threadthread1=newThread(){

            public void run(){

            objectCountDownLatch.countDown();

            System.out.println(1);

            }

        };

        thread1.start();

        Threadthread2=newThread(){

            public void run(){

                objectCountDownLatch.countDown();

                System.out.println(2);

            }

        };

        thread2.start();

        Threadthread3=newThread(){

            public void run(){

            //   objectCountDownLatch.countDown();

                System.out.println(3);

            }

        };

        thread3.start();

        try {

            objectCountDownLatch.await();

        }catch(Exception e) {

            System.out.println("Not");

        }

        System.out.println("final");

    }

}

4.2 CyclicBarrier效果演示

package test;

 

import java.util.concurrent.CyclicBarrier;

 

public classTestThread {

    public static void main(String[] args){

        CyclicBarrierobjectCyclicBarrier=new CyclicBarrier(3);

        Threadthread1=newThread(){

            public void run(){

                try{

                    objectCyclicBarrier.await();

                }catch(Exception e){

                   

                }

                System.out.println(1);

            }

        };

        System.out.println(4);

        thread1.start();

        Threadthread2=newThread(){

            public void run(){

                try{

                    objectCyclicBarrier.await();

                }catch(Exception e){

                   

                }

                System.out.println(2);

            }

        };

        thread2.start();

        Threadthread3=newThread(){

            public void run(){

                try{

                    objectCyclicBarrier.await();

                }catch(Exception e){

                   

                }

                System.out.println(3);

            }

        };

        thread3.start();

    }

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值