latch模式
门闸(latch)模式 指定一个屏障,只有所有的条件都满足的时候 门闸才可以打开执行后面任务
和Thread.join方法类似 当子线程调用join方法会阻塞所在的主线程,直到子线程执行完成后才运行主线程代码
latch门闸抽象类
public abstract class Latch {
// 用于控制多少个线程完成任务时才打开门闸
protected int limit;
// 构造传入limit参数
public Latch(int limit){
this.limit = limit;
}
// 该方法会使用当前线程(主线程)一直等待 直到所有其他线程(子线程)执行完成工作,当前线程是允许被中断的
// 无超时时间
public abstract void await() throws InterruptedException;
// 有超时时间
public abstract void await(TimeUnit unit,long time) throws InterruptedException,WaitTimeOutException;
// 当其他线程完成任务后计数器减一
public abstract void countDown();
// 获取当前还有几个线程没有执行完成
public abstract int getUnarrived();
}
latch抽象类的实现类
/**
* latch抽象类的实现
*/
public class CountDownLatch extends Latch{
// 增加回调功能
private final Runnable runnable;
public CountDownLatch(int limit,Runnable runnable) {
super(limit);
this.runnable = runnable;
}
@Override
public void await() throws InterruptedException {
synchronized (this){
// 其他线程没有全部执行完成 主线程阻塞
while (limit > 0){
this