CountDownLatch问题汇总

CountDownLatch解决什么问题

主要解决线程之间的等待问题,CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行。简单的举例主线程等子线程执行结束后,主线程再执行其他业务逻辑。

CountDownLatch

实现也是基于AQS来实现的

应用场景

比如map-reduce任务中把大任务分成小任务,小任务执行结束后再汇总,比较适合多线程处理,然后把结果进行汇总。5个线程分批计算1-100求和。

import org.testng.collections.Lists;

import java.util.List;
import java.util.concurrent.CountDownLatch;

public class CountDownLatchSum {

    private static CountDownLatch countDownLatch = new CountDownLatch(4);

    public static void main(String[] args) throws InterruptedException {
        List<Integer> res = Lists.newArrayList();
        res.add(1);
        res.add(2);
        res.add(3);

        Task one = new Task(res);
        res = Lists.newArrayList();
        res.add(4);
        res.add(5);
        res.add(6);
        Task two = new Task(res);
        res = Lists.newArrayList();
        res.add(7);
        res.add(8);
        res.add(9);
        Task thr = new Task(res);
        res = Lists.newArrayList();
        res.add(10);
        res.add(11);
        res.add(12);
        Task forT = new Task(res);

        new Thread(one).start();
        new Thread(two).start();
        new Thread(thr).start();
        new Thread(forT).start();

        countDownLatch.await();
        int sum =0;
        sum+=one.getSum();
        sum+=two.getSum();
        sum+=thr.getSum();
        sum+=forT.getSum();

        System.out.println(sum);
    }

    static class Task implements Runnable{

        private List<Integer> res;

        private int sum;

        public Task(List<Integer> res){
            this.res=res;
        }

        @Override
        public void run() {
            for (int num : res) {
                sum += num;
                System.out.println("thread name:" + Thread.currentThread().getName() + " sum=" + sum);
            }
            countDownLatch.countDown();//标记已经完成一个任务
        }
        public int getSum(){
            return sum;
        }
    }
}

结果如下:

thread name:Thread-3 sum=10
thread name:Thread-1 sum=4
thread name:Thread-2 sum=7
thread name:Thread-0 sum=1
thread name:Thread-2 sum=15
thread name:Thread-1 sum=9
thread name:Thread-3 sum=21
thread name:Thread-1 sum=15
thread name:Thread-2 sum=24
thread name:Thread-0 sum=3
thread name:Thread-3 sum=33
thread name:Thread-0 sum=6
78

比较适合顺序执行,循环顺序执行就不太行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值