java 并发包之countDownLatch

countDownLatch是Java.util.concurrent里的并发工具包。它是让某个线程等待其他线程处理完再执行。

所用场景:例如导出10万条的订单记录时,需要对每一条订单记录进行处理后再导出,这是由于数据量过大需要采用10个线程对这10万条数据进行处理,那么导出execel的这个动作或者线程需等待上面10个线程处理完再执行。

构造方法:new CountDownLatch(int count);count 为需要等待的线程数。例如上述场景是等待10个线程,这里count就为10。
核心api:
countDown();每执行一次count就减一,即等待的线程数减一。
await();执行这个方法时,如果count不为0,则执行这个方法的线程阻塞直到count变为0

用java伪代码举例一个。

public class CountDownLatchTest{

    static CountDownLatch count = new CountDownLatch(3);
    static List<Integer> number = new ArrayList<Integer>();

    public static void main(String[] args){

        CountDownLatchTest test = new CountDownLatchTest(); 
        Thread.currentThread().setName("主线程");

        new Thread(test.new Number(number,10,count),"线程1").start();//线程1塞数据
        new Thread(test.new Number(number,20,count),"线程2").start();//线程2塞数据
        new Thread(test.new Number(number,30,count),"线程3").start();//线程3塞数据

        try {
            System.out.println(Thread.currentThread().getName()+"等待");
            count.await();//主线程等待线程1,2,3执行

//线程1,2,3执行结束,主线程开始执行System.out.println(Thread.currentThread().getName()+"执行");
            int sum =0;
            for(Integer num:number){
                sum =sum+num;
            }
            System.out.println("number计算总和结果"+sum);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    class Number implements Runnable{

        List<Integer> number;
        int index;
        CountDownLatch count;

        public void run() {
            System.out.println(Thread.currentThread().getName()+"执行......");
            synchronized (number) {
                for(int i=0;i<index;i++){
                    number.add(i);
                }
                count.countDown();
            }
            System.out.println(Thread.currentThread().getName()+"结束......");
        }

        Number(List<Integer> number,int index,CountDownLatch count){
            this.number=number;
            this.index=index;
            this.count=count;
        }
    }
}

执行结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/CSDNzhangtao5/article/details/68079247