在java中使用countDown latch

时间:2015-05-18 11:12:18

标签: java multithreading countdownlatch

是java编程的新手,第一次在java中使用countDown,

我的代码段是,

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");

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

正如我从另一篇文章中读到的那样,

  

CountDownLatch的一个缺点/优点是它没有   可重复使用一旦计数达到零,您就无法使用CountDownLatch   更多。

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

问题是:

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

我不太了解countDown latch的用法。请解释我。

2 个答案:

答案 0 :(得分:1)

使用某些值初始化CountDownLatch时,例如:

CountDownLatch latch = new CountDownLatch(3);

它基本上意味着当方法:

latch.countDown();

将被触发三次,将使用latch的类将从await方法调用中释放。

当然,您必须确保使用相同的latch实例。 有关更多信息,请转到精彩教程:http://tutorials.jenkov.com/java-util-concurrent/countdownlatch.html

答案 1 :(得分:1)

这里似乎你不使用多线程,并且所有工作都在一个线程中完成,因为你不需要使用CountDownLatch

同样latch.await();挂起,因为它等待所有count任务将完成(在这里//行-2,列-3 = 6)并调用latch.countDown();。详细了解docs

以下是使用的简单示例,其中t2等待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();
    }

}