`

CountDownLatch and CyclicBarrier

 
阅读更多

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

 

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());
   }
 }

 

分享到:
评论

相关推荐

    详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别

    在Java并发编程中,CountDownLatch和CyclicBarrier都是用于协调多线程间同步的重要工具,它们可以帮助开发者在特定条件满足时启动或者结束线程的执行。本文将详细探讨这两个类的内部实现机制以及它们在实际应用场景...

    Java并发编程之美_部分71

    在 CountDownLatch 中,计数器值减 1 的操作是原子的,使用 CAS(Compare-And-Swap)来实现。CAS 失败则循环重试,否则如果当前计数器值为 0 则返回 true,返回 true 说明是最后一个线程调用的 countdown 方法,那么...

    笔记-2、线程的并发工具类2

    - CountDownLatch的放行是由第三方(持有计数器的线程)控制,而CyclicBarrier的放行是由参与等待的线程自身控制。 - CountDownLatch的放行条件是计数器的值大于等于线程数,而CyclicBarrier的放行条件是计数器值...

    Java中的CyclicBarrier类最全讲义

    虽然`CyclicBarrier`和`CountDownLatch`都是Java并发工具包中用于实现线程间协作的工具,但它们之间存在一些关键的区别: - **用途**:`CyclicBarrier`主要用于需要多个线程同时到达一个点的情况,而`...

    关于 java.util.concurrent 您不知道的 5 件事,第 2 部分

    2. **CountDownLatch与CyclicBarrier** CountDownLatch是一个同步辅助类,允许一个或多个线程等待其他线程完成操作。它是一个一次性使用的计数器,当计数值为0时,所有等待的线程才能继续执行。CyclicBarrier则允许...

    计算机后端-Java-Java高并发从入门到面试教程-可.zip

    Java提供了丰富的并发工具和API,如线程池(ExecutorService)、同步工具类(Semaphore、CyclicBarrier、CountDownLatch)以及并发集合(ConcurrentHashMap、CopyOnWriteArrayList等)。 **线程基础**:了解线程的...

    七周七并发高清版附送惊喜书籍

    6. **并发工具类**:分析CountDownLatch、CyclicBarrier、Semaphore等并发工具,以及它们在协调多线程任务中的作用。 7. **并行流与Lambda表达式**:Java 8引入的新特性,如并行流,如何通过函数式编程简化并发任务...

    java.util.concurrent 测试源文件

    6. **并发工具类**:如CountDownLatch、CyclicBarrier、Semaphore等,用于协调多线程间的同步。例如,CountDownLatch常用于等待一组线程完成;CyclicBarrier允许一组线程到达一个屏障时暂停,直到所有线程都到达;...

    java 多线程同步

    包括线程安全集合(如ConcurrentHashMap、CopyOnWriteArrayList等)、线程池(ExecutorService、ThreadPoolExecutor、ScheduledThreadPoolExecutor等)、信号(CountDownLatch、CyclicBarrier、Semaphore等)以及...

    JAVA面试 葵花宝典and九阴真经

    4. **并发编程**:线程池的使用、并发工具类(如Semaphore、CountDownLatch、CyclicBarrier)以及并发容器(如ConcurrentHashMap)。 5. **网络编程**:TCP/IP协议、HTTP协议,以及Socket编程等基础知识。 6. **...

    Java并发编程学习笔记

    CountDownLatch用于一次性让多个线程等待,CyclicBarrier则允许一组线程等待直到所有线程到达屏障点后一起继续执行,Semaphore管理有限资源的访问权限。 6. **线程池原理**: 线程池通过预先创建一组线程,复用...

    JUC线程锁框架

    CountDownLatch、CyclicBarrier、Semaphore等同步器在多线程协同工作中起到关键作用。CountDownLatch用于一次性释放多个等待线程,CyclicBarrier则让一组线程等待直到所有线程到达屏障点,Semaphore则控制对共享...

    实战Java高并发程序设计模式视频

    2. **Java并发API**:深入研究Java并发库,如`java.util.concurrent`包下的工具类,如ExecutorService、Semaphore、CountDownLatch、CyclicBarrier等,以及它们在并发控制中的作用。 3. **锁机制**:掌握...

    jdk-1.6.rar

    另外,java.util.concurrent包中的并发工具类也得到了加强,如CountDownLatch、CyclicBarrier等,为多线程编程提供了便利。 JDK 1.6还引入了Swing的改进,包括新的LookAndFeel,使得Swing组件更加美观,并且提供了...

    java并发编程:juc、aqs

    共享模式下,多个线程可以同时访问执行,如Semaphore、CountDownLatch和CyclicBarrier。ReentrantReadWriteLock则结合了这两种模式,允许多个线程同时对同一资源进行读操作。 2. **等待队列**:AQS使用CLH(Craig, ...

    JUC并发编程与源码分析视频课.zip

    5. **并发工具类**:包括CountDownLatch、CyclicBarrier、Semaphore、Exchanger等,这些工具可以帮助开发者协调多个线程间的协作,实现复杂的并发控制逻辑。 6. **Future和CompletableFuture**:讲解如何使用Future...

    java六大必须理解的问题

    理解线程安全、同步机制(synchronized关键字、Lock接口、volatile变量)以及并发工具类(如Semaphore、CountDownLatch、CyclicBarrier)是编写高效并发代码的基础。 3. **异常处理(Exception Handling)** Java...

    Java多线程源码笔记.pdf

    9. 线程常用的工具栏:Java提供了一些并发工具类,如CountDownLatch、CyclicBarrier和Semaphore。CountDownLatch可以用于计数,等待某个任务完成;CyclicBarrier用于一组线程相互等待至某个条件达成;Semaphore则...

    guava-18.0(guava-18.0.jar和guava-18.0-sources.jar)

    2. **并发支持**:Guava提供了强大的并发工具,如Futures、Lists、Maps和Sets的并发版本,以及CountDownLatch、CyclicBarrier和Semaphore等并发控制工具。 3. **函数式编程**:Guava引入了Function、Predicate和...

    来吧!再谈多线程(详细).doc

    了解了这些基础概念后,我们还可以深入研究更多 Java 多线程的高级特性,如 CountDownLatch、CyclicBarrier、Semaphore 和 ExecutorService 等工具类,它们能帮助我们更好地管理和协调线程,实现更复杂的并发控制...

Global site tag (gtag.js) - Google Analytics