package org.meng.juc;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @ClassName: CountDownLatch
* @Description: 闭锁;在完成某些运算时,只有其他所有现成的运算全部完成,当前运算才继续执行
* 多个线程操作num,线程1实现监控num,当num到2时,线程1给出提示并结束
* CountDownLatch不涉及锁定,当count的值为零时当前线程继续运行
* 当不涉及同步,只是涉及线程通信的时候,用synchronized + wait/notify就显得太重了
* 这时应该考虑countdownlatch/cyclicbarrier/semaphore
* 场景1 让多个线程等待:模拟并发,让并发线程一起执行
* 场景2 让单个线程等待:多个线程(任务)完成后,进行汇总合并
* @Author: MengMeng
* @Date: 2021/1/17 10:47 上午
* @Version: v1.0
*/
public class TestCountDownLatch {
// 保证加减操作线程安全
AtomicInteger num = new AtomicInteger();
public static void main(String[] args) {
TestCountDownLatch tcd = new TestCountDownLatch();
final CountDownLatch latch = new CountDownLatch(2);
LathDemo ld = new LathDemo(latch,tcd);
new Thread(() -> {
String parter = "[" + Thread.currentThread().getName() + "]";
System.out.println(parter + "开始");
if(tcd.num.get() != 2){
try {
// latch减为0使得await()生效
latch.await();
// 设置时间自动结束
// latch.await(5000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(tcd.num.get());
System.out.println(parter + "结束");
}).start();
for (int i = 0; i < 5; i++) {
new Thread(ld).start();
}
}
}
class LathDemo implements Runnable {
private CountDownLatch latch;
private TestCountDownLatch tcd;
public LathDemo(CountDownLatch latch, TestCountDownLatch tcd) {
this.latch = latch;
this.tcd = tcd;
}
@Override
public void run() {
synchronized (this) {
String parter = "[" + Thread.currentThread().getName() + "]";
try {
tcd.num.getAndIncrement();
System.out.println(parter + "执行……");
}finally {
latch.countDown();
System.out.println(parter + "结束……");
}
}
}
}