首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CountDownLatch -了解await和countDown

CountDownLatch -了解await和countDown
EN

Stack Overflow用户
提问于 2012-03-23 11:02:23
回答 2查看 8.8K关注 0票数 5

根据Javadoc的说法: CountDownLatch是用给定的计数初始化的。await方法会一直阻塞,直到当前计数为零。

这意味着在下面的代码中,因为我将CountDownLatch初始化为1。只要锁存器调用倒计时,所有线程都应该从它的await方法中解锁。

但是,主线程正在等待所有线程完成。而且,我没有将主线程连接到其他线程的末尾。为什么主线程在等待?

代码语言:javascript
复制
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.atomic.AtomicLong;

public class Sample implements Runnable {

    private CountDownLatch latch;

    public Sample(CountDownLatch latch)
    {
        this.latch = latch;
    }
    private static AtomicLong number = new AtomicLong(0);

    public long next() {
         return number.getAndIncrement();
    }

    public static void main(String[] args) {

        CountDownLatch latch = new CountDownLatch(1);
        for (int threadNo = 0; threadNo < 4000; threadNo++) {
          Runnable t = new Sample(latch);
          new Thread(t).start();
        }
        try {
            latch.countDown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try {
            latch.await();
            Thread.sleep(100);
            System.out.println("Count:"+next());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-23 12:42:15

尝试运行以下修改后的代码版本:

代码语言:javascript
复制
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicLong;

public class Test implements Runnable {

    private CountDownLatch latch;

    public Test(CountDownLatch latch)
    {
        this.latch = latch;
    }
    private static AtomicLong number = new AtomicLong(0);

    public long next() {
         return number.getAndIncrement();
    }

    public static void main(String[] args) {

        CountDownLatch latch = new CountDownLatch(1);
        for (int threadNo = 0; threadNo < 1000; threadNo++) {
          Runnable t = new Test(latch);
          new Thread(t).start();
        }
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println( "done" );
    }

    @Override
    public void run() {
        try {
            Thread.sleep(1000 + (int) ( Math.random() * 3000 ));
            System.out.println(next());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            latch.countDown();
        }
    }

}

您应该会看到类似这样的内容:

%0

完成

1

2

3.

4.

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19个

这表明在第一个线程latch.countDown()之后,主线程确实解除了对latch.await()调用的阻塞

票数 6
EN

Stack Overflow用户

发布于 2012-03-23 11:07:06

您正在启动4000个线程,它们只等待100毫秒。你很可能会压倒整个盒子(所有的线程都会在大致相同的时间结束)。在您的线程启动外观中添加睡眠,并尝试增加超时以查看它是否如您所期望的那样工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9833636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档