(资料图片)
CountDownLatch是在Java多线程协作等待中最为常用的一个程序类,在本课程中将为读者讲解该类的主要特点,并通过具体的Java并发编程案例进行开发演示。
CountDownLatch是一种基于倒计数同步的线程管理机制,例如:咱们跟团出去旅游的时候,一般都会对未归队的人员进行一个统计,每当归队一位,就进行计数的减少,一直到计数为0的时候才进行后续的活动。
例如:现在在主线程里面创建了三个子线程,而后主线程必须在这三个子线程全部执行完成之后再继续向下执行,所以此时就可以基于一个CountDownLatch设置等待的线程数量为3,每当一个子线程执行完毕后就进行一个计数的减1操作。
范例:使用CountDownLatche实现计数同步
package com.yootk;import java.util.concurrent.CountDownLatch;import java.util.concurrent.TimeUnit;public class YootkDemo { // 李兴华编程训练营public static void main(String[] args) throws Exception { // 沐言yootkCountDownLatch latch = new CountDownLatch(3); // 总共的等待的数量为3for (int x = ; x < 3; x++) {new Thread(()->{try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.printf("【%s】到达,并且已上车%n", Thread.currentThread().getName());latch.countDown(); // 减1},"游客 - " + x).start();}latch.await(); // 等待计数为后再解除阻塞System.out.println("【主线程】所有的旅客都到齐了,开车走人,去下一个景点购物消费。");} }
需要注意的是,由于CountDownLatch没有所谓的公平与非公平的机制,所以其内部只是创建了一个Sync子类,所以在该类的构造方法之中仅仅只是提供了一个Sync(AQS子类)对象实例化。
public CountDownLatch(int count) {if (count < ) throw new IllegalArgumentException("count < 0");this.sync = new Sync(count); }