最近笔试遇到一道题,面试时又把这道题改成了填空题,笔试时猜对了,但是面试时却答不上来了。由于不懂,所以特别的去看了一下,写在这里:
说出下面程序的运行输出结果:
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.CountDownLatchCountDownLatch(int count) 构造一个用给定计数初始化的
CountDownLatch。
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
用给定的计数 初始化 CountDownLatch。由于调用了 countDown()
方法,所以在当前计数
到达零之前,await
方法会一直受阻塞。之后,会释放所有等待的线程await
的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用CyclicBarrier
。
如果 CountDownLatch cdl = new CountDownLatch(3);
cdl.await();
那么每调用一次countDown()方法,就会减去1, 调用三次countDown()后, 就会释放cdl这个线程。
阅读(2386) | 评论(0) | 转发(0) |