java并发编程之二

CountDownLatch类

  允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。

  CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成了任务,然后在CountDownLatch上等待的线程就可以恢复执行任务。

构造方法:

  CountDownLatch(int count)

构造一个以给定计数 CountDownLatch CountDownLatch。

方法:

  • await() 导致当前线程等到锁存器计数到零,除非线程是 interrupted 。

  • await(long timeout, TimeUnit unit) 使当前线程等待直到锁存器计数到零为止,除非线程为 interrupted或指定的等待时间过去。

  • countDown() 减少锁存器的计数,如果计数达到零,释放所有等待的线程。

  • getCount() 返回当前计数。

    模拟运动员赛跑DEMO

1 1 import concurrenttest.countdownlatch.thread.Thread_1; 2 2 3 3 import java.util.concurrent.CountDownLatch; 4 4 5 5 /** 6 6 * 描述:模拟运动员赛跑DEMO 7 7 * 8 8 * @author bc 9 9 * @create 2018-09-28 10:49 1010 */ 1111 public class RunTest_1 { 1212 1313 public static void main(String[] args) { 1414 try { 1515 CountDownLatch comingTag = new CountDownLatch(10);//裁判等待运动员到来 1616 CountDownLatch waitTag = new CountDownLatch(1);//等待裁判说准备开始 1717 CountDownLatch waitRunTag = new CountDownLatch(10);//等待起跑 1818 CountDownLatch beginTag = new CountDownLatch(1);//起跑 1919 CountDownLatch endTag = new CountDownLatch(10);//到达终点 2020 2121 Thread_1[] arr = new Thread_1[10]; 2222 for (int i = 0; i < arr.length; i++) { 2323 arr[i] = new Thread_1(comingTag, waitTag, waitRunTag, beginTag, endTag); 2424 arr[i].start(); 2525 } 2626 2727 System.out.println("裁判等待运动员到来"); 2828 comingTag.await(); 2929 System.out.println("裁判看到所有运动员都来了,巡视一下"); 3030 Thread.sleep(5000); 3131 waitTag.countDown(); 3232 System.out.println("各就各位!"); 3333 waitRunTag.await(); 3434 Thread.sleep(2000); 3535 System.out.println("发令枪响!"); 3636 beginTag.countDown(); 3737 endTag.await(); 3838 System.out.println("所有运动员到了,统计结果"); 3939 } catch (InterruptedException e) { 4040 e.printStackTrace(); 4141 } 4242 4343 } 4444 }

RunTest_1

1 1 import java.util.concurrent.CountDownLatch; 2 2 3 3 /** 4 4 * 描述: 模拟运动员赛跑 5 5 * 6 6 * @author bc 7 7 * @create 2018-09-28 10:10 8 8 */ 9 9 public class Thread_1 extends Thread { 1010 1111 private CountDownLatch comingTag;//裁判等待运动员到来 1212 private CountDownLatch waitTag;//等待裁判说准备开始 1313 private CountDownLatch waitRunTag;//等待起跑 1414 private CountDownLatch beginTag;//起跑 1515 private CountDownLatch endTag;//到达终点 1616 1717 public Thread_1(CountDownLatch comingTag, CountDownLatch waitTag, CountDownLatch waitRunTag, 1818 CountDownLatch beginTag, CountDownLatch endTag) { 1919 super(); 2020 this.comingTag = comingTag; 2121 this.waitTag = waitTag; 2222 this.waitRunTag = waitRunTag; 2323 this.beginTag = beginTag; 2424 this.endTag = endTag; 2525 } 2626 2727 @Override 2828 public void run() { 2929 try { 3030 System.out.println("运动员正飞奔而来"); 3131 Thread.sleep((int)(Math.random()*10000)); 3232 System.out.println(Thread.currentThread().getName()+"到起跑点了"); 3333 comingTag.countDown(); 3434 System.out.println("等待裁判说准备"); 3535 waitTag.await(); 3636 System.out.println("各就各位!准备起跑的姿势"); 3737 Thread.sleep((int)(Math.random()*10000)); 3838 waitRunTag.countDown(); 3939 beginTag.await(); 4040 System.out.println(Thread.currentThread().getName()+"疯狂奔跑中"); 4141 Thread.sleep((int)(Math.random()*10000)); 4242 endTag.countDown(); 4343 System.out.println(Thread.currentThread().getName()+"到达终点"); 4444 } catch (InterruptedException e) { 4545 e.printStackTrace(); 4646 } 4747 4848 } 4949 }

Thread_1

CountDownLatch的不足
CountDownLatch是一次性的,计数器的值只能在构造方法中初始化一次,之后没有任何机制再次对其设置值,当CountDownLatch使用完毕后,它不能再次被使用。

详见本人github:https://github.com/BrokenColor/java-demo 下的 countdownlatch-包中的测试

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java并发中CountDownLatch的使用

java并发中CountDownLatch的使用在java并发中,控制共享变量的访问非常重要,有时候我们也想控制并发线程的执行顺序,比如:等待所有线程都执行完毕之后再执行另外的线程,或者等所有线程都准备好了才开始所有线程的执行等。这个时候我们就可以使用到CountDownLatch。简单点讲,CountDownLatch存有一个放在QueuedS

Java多线程并发控制工具CountDownLatch,实现原理及案例

闭锁(CountDownLatch)是Java多线程并发中的一种同步器,它是JDK内置的同步器。通过它可以定义一个倒计数器,当倒计数器的值大于0时,所有调用await方法的线程都会等待。而调用countDown方法则可以让倒计数器的值减一,当倒计数器值为0时所有等待的线程都将继续往下执行。闭锁的主要应用场景是让某个或某些线程在某个运行节点上等待N个条件都

Java多线程并发控制工具信号量Semaphore,实现原理及案例

信号量(Semaphore)是Java多线程兵法中的一种JDK内置同步器,通过它可以实现多线程对公共资源的并发访问控制。一个线程在进入公共资源时需要先获取一个许可,如果获取不到许可则要等待其它线程释放许可,每个线程在离开公共资源时都会释放许可。其实可以将Semaphore看成一个计数器,当计数器的值小于许可最大值时,所有调用acquire方法的线程都可以得到

CountDownLatch和CylicBarrier以及Semaphare你使用过吗

CountDownLatch是什么CountDownLatch的字面意思:倒计时门栓它的功能是:让一些线程阻塞直到另一些线程完成一系列操作后才唤醒。它通过调用await方法让线程进入阻塞状态等待倒计时0时唤醒。它通过线程调用countDown方法让倒计时中的计数器减去1,当计数器为0时,会唤醒哪些因为调用了await而阻塞的线程。

Java CyclicBarrier介绍

CyclicBarrier(周期障碍)类可以帮助同步,它允许一组线程等待整个线程组到达公共屏障点。CyclicBarrier是使用整型变量构造的,其确定组中的线程数。当一个线程到达屏障时(通过调用CyclicBarrier.await()),它会被阻塞,直到所有线程都到达屏障,然后在该点允许所有线程继续执行。与CountDownLatch不同的

java并发编程之二 - HelloWorld