CounDownLatch介绍

这里写自定义目录标题

CounDownLatch

1简介

countDownLatch是在java1.5被引入,跟它一起被引入的工具类还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue

2.CounDownLatch具体是干什么用的,有什么Api

countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。
是通过维护一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。

2.1 API

//1构造方法 参数count为计数值
public CountDownLatch(int count) {  };  

//2调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
public void await() throws InterruptedException { };   
//3 与await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  
//4 将count值减1
public void countDown() { };  

注: 一般 await()与 countDown() 方法联合起来使用达到线程所有的都执行完后才会往下执行其他的代码;

3 CounDownLatch 与CyclicBarrier区别

CountDownLatch: 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。

 CyclicBrrier: N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待

4简单的使用

package com.momo.spring.builder;

import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestDemo {
	private static Random random = new Random(System.currentTimeMillis());
    private static ExecutorService executor = Executors.newFixedThreadPool(2);
    private static final CountDownLatch countDownLatch = new CountDownLatch(11);
    public static void main(String[] args) throws InterruptedException {
        //(1)查询数据
        int[] data = query();
        //(2)并行处理数据
        for(int i = 0; i < data.length; i++) {
            executor.execute(new SimpleRunnable(data, i));
        }
        //(3)
        countDownLatch.await();
        System.out.println("all of work finish done.");
    }
    
    static class SimpleRunnable implements Runnable    {
        private final int[] data;
        private final int index;
        
        public SimpleRunnable(int[] data, int index) {
            this.data = data;
            this.index = index;
        }
        
        @Override
        public void run() {
            try {
                Thread.sleep(random.nextInt(2000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            int value = data[index];
            if(value % 2 == 0) {
                data[index] = value * 2;
            } else {
                data[index] = value * 10;
            }
            countDownLatch.countDown();
            System.out.println(Thread.currentThread().getName() + " finished.");
        }
    }
    
    private static int[] query() {
        return new int[] {0,1,2,3,4,5,6,7,8,9,10};
    }
}

当注掉 countDownLatch.await();这个的时候
结果当注掉  countDownLatch.await()的结果
当放开 countDownLatch.await()
发现 all of work finish done 在其他十一个线程执行完后才执行
结果
在这里插入图片描述
5原理实现
底层依靠 AQS来实现,共享锁维护一个state的状态当其状态为0后才会往下执行

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值