gpt4 book ai didi

java - 我怎样才能在一个对象上 wait() 然后在另一个对象上 notifyAll?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:03:01 24 4
gpt4 key购买 nike

我相信我面临的问题是嵌套监视器锁定的变体。基本上我有两组线程(不是线程组,只是逻辑组)。一组线程(比如说后台组)将等待一个对象,而另一组线程正在工作(工作组)。工作线程一个接一个地完成,直到最后一个工作线程在“完成”方法中。我想做的是想出一些方法让最后一个工作线程等待,然后然后调用 notifyAll() 来唤醒所有后台线程。正如您可能猜到的那样,两组线程正在来回切换 - 一组正在工作,而另一组正在等待,然后组切换。问题是,如果我在当前等待的线程上使用 notifyAll(),则无法保证最终工作线程会在通知线程完成并尝试开始下一次交换之前进入 wait() 调用。

抱歉,如果这个问题有点离题 - 似乎我在并发方面的工作越多,我的代码就变得越复杂 :(

最佳答案

听起来您需要类似 Gate 类的东西,它由两个 CountDownLatch 实例组成。我在很多多线程测试中使用了类似的东西。

您的等待线程都调用 gate.ready() 并且工作线程在完成时调用 gate.go()

请注意,此特定实现假设有 1 个协调器线程。要支持更多,只需使用您需要的等待线程数构造 go 锁存器。

/**
* Simple starting gate for co-ordinating a bunch of threads.
*/
final class Gate {
final CountDownLatch ready;
final CountDownLatch go = new CountDownLatch(1);

Gate(final int threads) {
ready = new CountDownLatch(threads);
}

/**
* Called from the racing threads when ready. They will then block until all
* threads are at this point;
*/
void ready() {
ready.countDown();
await(go);
}

/**
* Called from the starter thread. Blocks until everybody is ready, and then
* signals go.
*/
void go() {
await(ready);
go.countDown();
}

static void await(final CountDownLatch latch) {
try {
if (!latch.await(5, TimeUnit.SECONDS)) { // arbitrary, parameterise for production use
throw new TimedOutException()
}
} catch (final InterruptedException e) {
throw new RuntimeException(e);
}
}

static final class TimedOutException extends IllegalStateException {}
}

如果您需要未知的任意线程数,您可能需要类似于 Java7 中 Doug Lea 的 Phaser 类的东西。

关于java - 我怎样才能在一个对象上 wait() 然后在另一个对象上 notifyAll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4300724/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com