CountDownLatch and CyclicBarrier

本文深入解析了Java并发包中CountDownLatch与CyclicBarrier的使用方法及应用场景。CountDownLatch作为闭锁机制,确保多个线程在特定条件达成前保持等待状态;而CyclicBarrier则作为循环屏障,使一组线程在达到指定数量后同步继续执行。

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

 一个 闩 , 一个 屏障 ,都是障碍物!只要达到特定条件时,才能移除,继续同行!

 

CountDownLatch ?

  - 闭锁,管理一个和多个线程,只有满足某个条件才能运行!就像一个闩一样,如果你没有满足我的条件,那么就别想出去!

     用给定的计数 (count)初始化 CountDownLatch。由于调用了 countDown() 方法(count--),所以在当前计数到达零之前,await 
    方法会一直受阻塞。计数无法被重置,计数==0时释放所有等待的线程;

    应用场景 :  将一个任务分为n个独立的部分,等这些部分都完成后继续接下来的任务

  

重要的API :

   构造方法 : CountDownLatch(int count) // count 是线程数目?它是你可以调用countDown()的次数!

   countDown() // 线程的数目-1

   await() // 除非被中断 或者 Latch的count = 0 , 否则一直等待!

 

CyclicBarrier ?

 - 循环屏障!

 

API :

   构造方法 : CyclicBarrier(int parties)  

   await()  // 调用await()方法计数加1,若加1后的值不等于构造方法的值,则线程阻塞

              // 他会返回达到线程的索引

 

 

public class CountLatch { // ...
   public static void main(String[] args) throws InterruptedException {
     CountDownLatch startSignal = new CountDownLatch(1);
     CountDownLatch doneSignal = new CountDownLatch(5);

     for (int i = 0; i < 5; ++i) // create and start threads
       new Thread(new Worker(startSignal, doneSignal)).start();

     doSomethingElse();            // don't let run yet
     startSignal.countDown();      // let all threads proceed 如果不运行这个那么就会一直wait
     doSomethingElse();
     doneSignal.await();           // wait for all to finish
   }

	private static void doSomethingElse() {
		System.out.println("dodo.....");
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
 }

 class Worker implements Runnable {
   private final CountDownLatch startSignal;
   private final CountDownLatch doneSignal;
   Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
     this.startSignal = startSignal;
     this.doneSignal = doneSignal;
   }
   public void run() {
     try {
       startSignal.await();//只要startSignal的 count = 0 线程才能通过!‘闩’
       doWork();
       doneSignal.countDown();
     } catch (InterruptedException ex) {} // return;
   }

   void doWork() {
	   System.out.println(Thread.currentThread().getName() + " " + new Date());
   }
 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值