1 CountDownLatch 用法
CountDownLatch是java.util.concurrent包中一个类,CountDownLatch只要提供的机制是多个(具体数量等于初始化CountDownLatch时count的值)线程都达到了预期状态或者完成了预期工作时触发事件,其他线程可以等待这个事件来触发自己后续的工作。等待的线程可以是多个,即CountDownLatch可以唤醒多个等待的线程。到达自己预期状态的线程会调用CountDownLatch的countDown方法,而等待的线程会调用CountDownLatch的await方法。
什么情况下可以用这个cdl呢?我平常约朋友们打英雄联盟(5V5竞技游戏),然后总有那么一个人要在大家都上号了之后他才上号,这个情形就可以使用CDL来表示,废话不说直接上demo!
Player类作为我们提前上号的好队友,因为tx这垃圾服务器的存在,所以上号需要一定时间,这里随机数设置为等待0-10s~
/**
* @author :ChenHao86
* @date :Created in 2021/12/31 14:49
* @description:
* @modified By:
* @version: $
*/
public class Player implements Runnable {
private CountDownLatch downLatch;
private String name;
public Player(CountDownLatch downLatch, String name) {
this.downLatch = downLatch;
this.name = name;
}
public void run() {
this.doWork();
try {
TimeUnit.SECONDS.sleep(new Random().nextInt(10));
} catch (Exception e) {
}
System.out.println(this.name + "已经上号了!");
this.downLatch.countDown();
}
private void doWork() {
System.out.println(this.name + "正在上号!");
}
}
BadPlayer作为等大家都上了号以后,才上号那个拖延症坏队友
/**
* @author :ChenHao86
* @date :Created in 2021/12/31 14:49
* @description:
* @modified By:
* @version: $
*/
public class BadPlayer implements Runnable {
private CountDownLatch downLatch;
public BadPlayer(CountDownLatch downLatch){
this.downLatch = downLatch;
}
public void run() {
System.out.println("拖延症玩家等其他队友都上号.....");
try {
this.downLatch.await();
} catch (Exception e) {
}
System.out.println("其他队友都上号了,他终于上号了~!!");
}
}
主方法
/**
* @author :ChenHao86
* @date :Created in 2021/12/31 14:50
* @description:
* @modified By:
* @version: $
*/
public class CountDownLatchDemo {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5, 5, TimeUnit.SECONDS, new ArrayBlockingQueue(16));
CountDownLatch latch = new CountDownLatch(3);
Player p1 = new Player(latch, "盖伦");
Player p2 = new Player(latch, "瑞兹");
Player p3 = new Player(latch, "娑娜");
Player p4 = new Player(latch, "赵信");
BadPlayer badPlayer = new BadPlayer(latch);
executor.execute(p3);
executor.execute(p2);
executor.execute(p1);
executor.execute(p4);
executor.execute(badPlayer);
executor.shutdown();
}
}
shift+F10执行方法
搞定~