java的CountDownLatch,内部其实就是计数器
/**
* @author cmy
* @date 2020/12/24 13:34
*/
public class CountDownLatchTest {
static CountDownLatch latch = null;
public static void main(String[] args) {
ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 5, 30L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(4));
while (true){
//初始值不一定为线程个数,一个线程完全可以countDown多次
latch= new CountDownLatch(3);
for(int i = 1 ;i < 4 ; ++i){
pool.execute(new LatchRunner(latch, i+"号车手"));
}
try {
//countDown多次到0后,执行await之后语句
latch.await();
System.out.println("主线程继续执行");
System.out.println("sleep 20000");Thread.sleep(20000);
} catch (Exception e) {}
}
}
}
class LatchRunner implements Runnable {
private CountDownLatch latch;
private String name;
public LatchRunner(CountDownLatch latch, String name) {
super();
this.latch = latch;
this.name = name;
}
@Override
public void run() {
try {
Thread.sleep(1000 * (new Random()).nextInt(8));
System.out.println(name + " 准备好了...");
} catch (Exception e) {
e.printStackTrace();
}finally {
latch.countDown();
}
System.out.println(name+"结束");
}
}