天天看點

Java之CountDownLatchCountDownLatch

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

    }

}
           
Java之CountDownLatchCountDownLatch

繼續閱讀