主要解决线程之间的等待问题,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
比较适合顺序执行,循环顺序执行就不太行了。
因篇幅问题不能全部显示,请点此查看更多更全内容