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 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 res;

        private int sum;

        public Task(List 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

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

你可能感兴趣的:(CountDownLatch,java)