现在很多框架或者中间件由于多次迭代、优化和兼容、扩展处理,最核心的设计思想和原理很容易就被覆盖,导致我们想学习的时候就不太容易抓住主干。
先不看各种原理,就基与 CountDownLatch
提供的功能使用最简单的方式去实现 CountDownLatch
:
package dongguabai.concurrent;
/**
* @author Dongguabai
* @description
* @date 2022-04-25 12:38
*/
public class MyCountDownLatch {
private volatile int count;
public MyCountDownLatch(int count) {
this.count = count;
}
public synchronized void countDown() {
count--;
}
public void await() {
while (count > 0) {
}
}
public static void main(String[] args) {
//CountDownLatch cl
}
}
使用JUC之AQS之CountDownLatch中的例子测试一下:
package dongguabai.concurrent;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author Dongguabai
* @date 2018/9/24 11:46
*/
public class CountDownLaunthDemo implements Runnable{
static int count = 10;
static MyCountDownLatch end = new MyCountDownLatch(count);
static CountDownLaunthDemo demo = new CountDownLaunthDemo();
@Override
public void run() {
try {
Thread.sleep(new Random().nextInt(10)*1000);
System.out.println("check complete");
end.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
ExecutorService exec = Executors.newFixedThreadPool(count);
for (int i = 0; i < count; i++) {
exec.submit(demo);
}
end.await();
System.out.println("-------------Fire");
exec.shutdownNow();
}
}
输出:
check complete
check complete
check complete
check complete
check complete
check complete
check complete
check complete
check complete
check complete
-------------Fire
References
- https://blog.csdn.net/Dongguabai/article/details/82828331