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();
}
}
