JAVA多线程之——CyclicBarrier

CyclicBarrier是Java多线程中的一种同步工具,它使得N个线程可以相互等待,直到所有线程都到达指定点才能继续执行。与CountDownLatch的区别在于,CyclicBarrier的主体是多个线程间的相互等待,而CountDownLatch是一个线程等待其他线程。通过实例展示了CyclicBarrier如何在所有线程完成特定任务后执行后续操作,例如在所有导入任务完成后通知用户。

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

CyclicBarrier

CyclicBarrier : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。
CountDownLatch是某一个线程等待一个或者N个线程。
主体不同,CountDownLatch的主体是某一个线程。它是要一个或者多个线程完成某一个动作之后自己执行。这些线程互相之间是不等待的。
CyclicBaarier 主体是N个线程,就是说大家在某一个点上互相等待。只有大家都到了这个点,大家才能各自做自己接下来的事情。
还是用导入例子还说:

public class CyclicBarrierTest {
    static CyclicBarrier  ct = new CyclicBarrier(3);

    public static void main(String[] args) throws InterruptedException {

         new Thread(new ImportExcel(), "t1").start(); 
         new Thread(new ImportExcel(), "t2").start();
         new Thread(new ImportExcel(), "t3").start();
         System.out.println("导入成功。。。。。。。");


    }

    static class ImportExcel implements Runnable{
        @Override
        public void run() {
                    try {
                        System.out.println(Thread.currentThread().getName() +"导入成功");
                        ct.await();
                        System.out.println(Thread.currentThread().getName() +"记录日志");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }

        }

    }
}

某次运行结果:

导入成功。。。。。。。
t3导入成功
t1导入成功
t2导入成功
t2记录日志
t3记录日志
t1记录日志

结果可以看到,首先主线程是不等待其它线程的。第二,无论怎么运行,一定是t1,t2,t3都导入成功之后,才能大家各自做日志记录。这就是大家互相等待,一定要完成各自的任务才能接着做某事。当然它也能实现各自导入成功之后就通知用户导入成功:

public class CyclicBarrierTest {
    static CyclicBarrier  ct = new CyclicBarrier(3,new  Runnable() {

        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() +"通知用户导入成功");

        }
    });

    public static void main(String[] args) throws InterruptedException {

         new Thread(new ImportExcel(), "t1").start(); 
         new Thread(new ImportExcel(), "t2").start();
         new Thread(new ImportExcel(), "t3").start();


    }

    static class ImportExcel implements Runnable{
        @Override
        public void run() {
                    try {
                        System.out.println(Thread.currentThread().getName() +"导入成功");
                        ct.await();
                        System.out.println(Thread.currentThread().getName() +"记录日志");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }

        }

    }
}

只有导入成功之后,再通知用户。使用另外一个构造函数 public CyclicBarrier(int parties, Runnable barrierAction)。这个构造函数是只有在所有线程到达某个点之后再执行后面的Runnable中的run方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值