一、情景1
1.需求描述
有多批任务,每批任务需要由多个线程完成,同一批次内的多个任务不要求完成顺序,但是多个批次之间要求完成顺序。类似于:
批次号 | 任务数(线程数) | 前置条件 |
---|---|---|
1 | 10 | 无 |
2 | 20 | 批次1已完成 |
3 | 15 | 批次2已完成 |
… | … | … |
2. 实现方式(伪代码)
// 需求,等内层循环所有线程运行结束后,外层循环才可以继续进行下一次循环
int foreachTimes = 批次数;
for(int index = 0; index < foreachTimes; index++){
int threadSizeOfIncycle = 任务数(线程数);
// 同步计数器,只有计数器归0后,才允许下一次循环,因为每次任务数不同,所有每次都需要重新创建一个计数器
CountDownLatch cl = new CountDownLatch(threadSizeOfIncycle);
for(int index = 0; index < threadSizeOfIncycle; index++){
// 多线程同步执行任务
new Thread(
new Runnable(){
// 业务逻辑
doSomething();
// 释放同步计数
cl.countDown();
}
).start();
}
// 等待同步计数归0,然后开启下一轮循环
cl.await();
}