CountDownLatch
类介绍
1、类介绍
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。
下面的代码,先运行t2线程处于等待状态,当t1线程list =5 就会通知t2线程继续执行. t2线程执行结束,t1线程再继续执行.
(这样做的好处,如果用synchronized 方式需要等t1线程都操作完成,t2线程才会执行,达不到实时性)
import java.util.LinkedList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class Test {
private volatile static List list = new ArrayList();
public void add(){
list.add("CCD");
}
public int size(){
return list.size();
}
public static void main(String[] args) {
final ListAdd2 list2 = new ListAdd2();
//CountDownLatch这个工具类就可以做到实时通知的效果
final CountDownLatch countDownLatch = new CountDownLatch();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
for(int i = ; i <; i++){
list2.add();
System.out.println("当前线程:" + Thread.currentThread().getName() + "添加了一个元素..");
Thread.sleep();
if(list2.size() == ){
System.out.println("已经发出通知..");
countDownLatch.countDown();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
if(list2.size() != ){
try {
//进入等待,等待通知 才会往下执行
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("当前线程:" + Thread.currentThread().getName() + "收到通知线程停止..");
throw new RuntimeException();
}
}, "t2");
t2.start();
t1.start();
}
}