天天看点

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

继续阅读