Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1480712
  • 博文数量: 187
  • 博客积分: 10375
  • 博客等级: 上将
  • 技术积分: 3127
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-07 10:58
文章分类

全部博文(187)

文章存档

2013年(1)

2012年(8)

2011年(28)

2010年(36)

2009年(47)

2008年(67)

我的朋友

分类: Java

2008-11-29 19:07:42

最近笔试遇到一道题,面试时又把这道题改成了填空题,笔试时猜对了,但是面试时却答不上来了。由于不懂,所以特别的去看了一下,写在这里:
   
说出下面程序的运行输出结果:
 
public class TestCountDownLatch {
    public static void execute() throws InterruptedException{
        final int n = 3;
        final CountDownLatch start = new CountDownLatch(1);
        final CountDownLatch end = new CountDownLatch(n);
        System.out.println("A");
        Thread t = new Thread(){
                public void run(){
                    for (int i = 0; i < n; i++) {
                        try {
                            start.await();// 此处填空
                            System.out.println("B");
                        } catch (Exception e) {
                        } finally{
                            end.countDown();// 此处填空
                        }
                    }
                }
        };
        t.start();
       
        System.out.println("C");
        start.countDown();
        // 到达此处时,由于finally中已经调用了三次countDown()方法,计数已经是0了
        // 所以此处就不会被阻塞
        end.await();
        System.out.println("D");
    }
    /**
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        execute();
    }
}
 
正确的输出是:ACBBBD
 
其实这道题就是考CountDownLatch这个类的。可惜以前没涉及到,所以...
 
java.lang.Object
  继承者 java.util.concurrent.CountDownLatch
CountDownLatch(int count)
          构造一个用给定计数初始化的 CountDownLatch
 

一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用CyclicBarrier

如果 CountDownLatch cdl = new CountDownLatch(3);
    cdl.await();
那么每调用一次countDown()方法,就会减去1, 调用三次countDown()后, 就会释放cdl这个线程。
 
 
阅读(2386) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~