是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的用法。请解释我。
答案 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();
}
}