CountDownLatch笔记

来源:互联网 发布:视频文件旋转角度软件 编辑:程序博客网 时间:2024/06/05 16:48

CountDownLatch是java的concurrent包下的一个倒计时锁。

//倒计时锁public class CountDownLatch {    //锁    private final Sync sync;    //构造函数    //count:表示必须调用count次countDown()方法,await()方法才不会阻塞    //或者我们可以说倒计时数是count    //当然了,倒计时数必须是非负数    public CountDownLatch(int count) {        if (count < 0) throw new IllegalArgumentException("count < 0");        this.sync = new Sync(count);    }    //该方法使得当前线程一直阻塞,直到倒计时数是0,或者当前线程被其他线程中断而抛出InterruptedException异常    public void await() throws InterruptedException {        sync.acquireSharedInterruptibly(1);    }    //该方法有3种结果    //1.倒计时数是0,或者在达到超时timeout之前,倒计时数变为0,则返回true    //2.在达到超时timeout后,倒计时数还未变为0,则返回false    //3.当前线程被中断而该方法会抛出InterruptedException异常    public boolean await(long timeout, TimeUnit unit)        throws InterruptedException {        return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));    }    //1.倒计时数大于0,则倒计时数会递减1    //2.倒计时数等于0,则倒计时数不递减    public void countDown() {        sync.releaseShared(1);    }}

//=====================================================

通过代码来理解CountDownLatch的使用,当然了,在这里我只是单线程形式,一般情况下CountDownLatch都是使用在多线程模式下的。

java.util.concurrent.CountDownLatch latch = new java.util.concurrent.CountDownLatch(2);        try {            System.out.println("1");            boolean rs = latch.await(1L, TimeUnit.SECONDS);//1秒之后,await方法返回false,程序往下运行            System.out.println("2,rs:" + rs);            latch.countDown();            System.out.println("4");            latch.countDown();            latch.await();//必须调用了2次countDown()方法,计时数才变为0,await()方法不会阻塞            System.out.println("3");        } catch (InterruptedException e) {            e.printStackTrace();        }
..
0 0
原创粉丝点击