原创

第四篇 : CountDownLatch 闭锁


简介

Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器 的性能。

  • CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作 之前,它允许一个或多个线程一直等待。
  • 闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活 动直到其他活动都完成才继续执行:
  • 确保某个计算在其需要的所有资源都被初始化之后才继续执行;
  • 确保某个服务在其依赖的所有其他服务都已经启动之后才启动;
  • 等待直到某个操作所有参与者都准备就绪再继续执行。

实例

测出5个线程同时打印出5000以内的偶数,一共用耗时多少 ?

package com.gf.demo;


import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.concurrent.CountDownLatch;

public class TestCountDownLatch {

    public static void main(String args[]){
        CountDownLatch latch = new CountDownLatch( 5 );
        LatchDemo ld = new LatchDemo(latch);
        Instant start = Instant.now();

        for (int i = 0 ; i < 5 ; i++) {
            new Thread( ld ).start();
        }
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        long between = ChronoUnit.MILLIS.between( start , Instant.now() );
        
        System.out.println("耗时 = " + between);

    }

}

class LatchDemo implements Runnable {

    private CountDownLatch countDownLatch;

    public LatchDemo (CountDownLatch countDownLatch) {
        this.countDownLatch = countDownLatch;
    }

    @Override
    public void run() {

        try {
            for (int i = 0 ; i < 50000 ; i++) {
                if (i % 2 == 0) {
                    System.out.println(i);
                }
            }

        } finally {
            countDownLatch.countDown();
        }

    }
}

上面的实例,计数器的值为5,main 线程执行计算时间的任务调用 CountDownLatchawait()方法 ,进入等待;5个线程每次执行完任务都会执行CountDownLatchcountDown() 方法,对计数器的值进行减 1,计数器的值变为0时,就表示5个线程均已经完成了任务,然后就可以恢复等待的main线程继续执行了。

juc
  • 作者:程序员果果
  • 发表时间:2018-11-01 09:18
  • 版权声明:自由转载-非商用-非衍生-保持署名 (创意共享4.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论