java 中倒计时锁存器的使用

Usage of countDown latch in java

我是 java 编程新手,也是第一次在 java、

中使用倒计时

我的代码片段是,

CountDownLatch latch=new CountDownLatch(rows*columns); //rows -2 , columns -3
        for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < columns; j++) {
                            GUIView view = getView(1, 1);
                            if(view == null) {
                                if(ViewColumn(j +1) != null){
                                    latch.countDown(); //EDT
                                    continue;
                                }
                                 latch.countDown(); //EDT
                                 break;
                            }   
new Thread(new countDownThread(view,latch)).start(); //Where i do some other processing and do countDown 


                    }
        }
        try {
             logger.log("Before countdown await");
            latch.await();
            logger.log("After countdown await");

        }
        .........
        ........

正如我从另一个 post,

那里读到的

One of the disadvantages/advantages of CountDownLatch is that its not reusable once count reaches to zero you can not use CountDownLatch any more.

我的疑问是我在 for 循环中使用了 相同的实例 latch 。如果 CountDownLatch 不可重用,如果第一次迭代 latch.countDown() 开始并且在第三次迭代时变为零(第三次迭代中的 latch.countDown() 无效??)。

问题是:

当我调试 for 循环(使用 eclipse)时,当控制达到 latch.await(); 它就挂起。但是,如果我只是 运行 应用程序不会挂起。

我不太明白countDown latch的用法。请解释一下。

当您使用某个值初始化 CountDownLatch 时,例如:

CountDownLatch latch = new CountDownLatch(3);

基本意思是when method:

latch.countDown();

会被触发3次,class会使用latch的会从await方法调用中释放。

当然要保证使用同一个latch实例。 有关更多信息,请转到不错的教程:http://tutorials.jenkov.com/java-util-concurrent/countdownlatch.html

这里好像你没有使用多线程,所有的工作都在一个线程中完成,因为你不需要使用CountDownLatch

latch.await(); 挂起,因为它等待所有 count 任务完成(似乎在这里 //行 -2 ,列 -3 = 6)并调用 latch.countDown(); .在 docs.

中了解更多信息

这是一个简单的使用示例,其中 t2 wait for t1:

import java.util.concurrent.CountDownLatch;

public class Test {

    public static void main(String... s){
        final CountDownLatch cdl = new CountDownLatch(1);

        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                int i = 5;
                while(i-- > 0)
                    System.out.println("t2 wait me");
                cdl.countDown();
            }
        });


        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    cdl.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("done");
            }
        });

        t2.start();
        t1.start();
    }

}