java中的 CountDownLatch

实现原理:java

  • 今天浏览了一下它的源码,发现其实现是十分简单的,
  • 只是简单的继承了AbstractQueuedSynchronizer(AQS同步器),便实现了其功能。
  • 实现原理:
    • 让须要的暂时阻塞的线程,进入一个死循环里面,
    • 获得某个条件后再退出循环,以此实现阻塞当前线程的效果。
    • setState咱们能够暂时理解为设置一个计数器,当前计数器初始值为5。
      • 每次减一知道为零跳出去

===================================================并发

一、在java.util.concurrent包下工具

  • 在java1.5被引入的
  • 一块儿引入的并发工具类CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue

二、CountDownLatch 使一个线程等其余线程完成各自的工做后在执行线程

三、CountDownLatch是经过一个计数器来实现的,计数器的初始值为线程的数量code

  • 构造器中的计数值(count)实际上就是闭锁须要等待的线程数量
  • 没有提供任何机制去从新设置这个计数值

四、主线程必须在启动其余线程后当即调用CountDownLatch.await()方法对象

  • 其余N 个线程必须引用闭锁对象
  • 通知机制是经过 CountDownLatch.countDown()方法来完成
  • count的值等于0时,主线程就能经过await()方法,恢复执行本身的任务
public class Test {
     public static void main(String[] args) {   
         final CountDownLatch latch = new CountDownLatch(2);
 
         new Thread(){
             public void run() {
                 try {
                     System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");
                    Thread.sleep(3000);
                    System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");
                    latch.countDown();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
             };
         }.start();
 
         new Thread(){
             public void run() {
                 try {
                     System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");
                     Thread.sleep(3000);
                     System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");
                     latch.countDown();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
             };
         }.start();
 
         try {
             System.out.println("等待2个子线程执行完毕...");
            latch.await();
            System.out.println("2个子线程已经执行完毕");
            System.out.println("继续执行主线程");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
     }
}
相关文章
相关标签/搜索