转载:https://blog.csdn.net/weixin_40288381/article/details/87474970
理解:countdown设计模式设计思想是 当第一阶段任务运行到某个阀门时,才开始第二阶段任务的执行
概述
Count-Down设计模式其实也叫做Latch(阀门)设计模式。当若干个线程并发执行完某个特定的任务,然后等到所有的子任务都执行结束之后再统一汇总。
JDK自带CountDownLatch:
public static void main(String[] args) throws InterruptedException {
//设置countdown为5
CountDownLatch countDownLatch = new CountDownLatch(5);
System.out.println("线程第一阶段开始工作");
for(int i=0;i<5;i++) {
new Thread() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(100);
//计数器-1
countDownLatch.countDown();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
}
//直到计数器为0
countDownLatch.await();
System.out.println("阶段一全部完成,第二阶段开工");
}
打印结果:
线程第一阶段开始工作
Thread-0
Thread-1
Thread-3
Thread-2
Thread-4
阶段一全部完成,第二阶段开工
自定义CountDownLatch
public class Latch {
//阀门值
private final int latchnum;
//计数器
private int count=0;
public Latch(int latchnum) {
this.latchnum=latchnum;
}
public void countDown() {
synchronized (this) {
this.count++;
this.notifyAll();
}
}
public void await() {
synchronized (this) {
if(count!=latchnum) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
测试类:
public static void main(String[] args) throws InterruptedException {
Latch latch = new Latch(5);
System.out.println("线程第一阶段开始工作");
for(int i=0;i<5;i++) {
new Thread() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(100);
latch.countDown();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
}
latch.await();
System.out.println("阶段一全部完成,第二阶段开工");
}