【问题标题】:CountdownLatch countDown method behavior after completion of taskCountdownLatch 任务完成后的 countDown 方法行为
【发布时间】:2015-06-15 14:14:26
【问题描述】:

假设我有一个大小为 3 的倒计时闩锁,即 3 个线程是从父线程产生的。

CountDownLatch latch = new CountDownLatch(3);

latch.await().

现在将有三个线程在各自的任务完成后调用 countDown。

// do something
 latch.countDown();

我的问题是,任务完成的那一刻,执行该任务的线程的行为是什么。

该线程是在那个时刻终止,还是通过进入空闲状态等待一段时间。 ?

我可以在倒计时锁存器的 java 文档的任何地方找到它。

【问题讨论】:

  • 我认为它不会影响线程生命周期,除了可能导致线程屈服(允许锁定的线程恢复),但就线程生命周期而言,我认为它不会终止它完全。
  • 不过,我没有对此进行任何研究。
  • 线程将进入WAITING状态并“休眠”直到被调度器重新唤醒。如果此时返回的是 Runnable.run 方法,则 Thread 将会死掉。在Runnable.run 退出之前,Thread 无法知道是否需要执行更多代码。所以行为和调用Object.wait是一样的。
  • 在java doc中找不到的原因是它对线程终止没有影响。但是,如果您希望 3 个线程重复运行相同的任务,但只有在执行 await() 的线程不进行处理时,您需要更多的信号。
  • 这个问题需要一个更大的源代码示例:向我们展示一些方法,然后问一个问题,例如“当线程 A、B 和 C 调用 method1() 并且线程 D 调用 method2() 时,什么发生在线程 D 时..."

标签: java multithreading concurrency countdownlatch


【解决方案1】:

这取决于子线程中的代码。如果在CountDownLatch 之后还有更多计算要做,那么它将继续计算。如果没有,线程将终止。

【讨论】:

  • 还要注意,这完全独立于倒计时锁存器的存在与否。闩锁不会以任何方式直接影响任何线程的终止。
【解决方案2】:

您过于关注让 N 个从属线程向主线程发出信号的典型示例。

CountDownLatch 这个东西只是一个类,它允许代码阻塞,直到某些外部代理将锁存器倒计时到 0。期间。

这些代理可以是 N 个不同的线程,如您的示例所示,也可以是单个线程多次倒计时。因此,您应该停止将这些代理视为线程。闩锁不认识他们,也不在乎他们是否在倒计时后去酒吧喝啤酒,而不是完成。它不是线程管理器,也不监控任何线程的生命周期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多