gpt4 book ai didi

java - 有没有更好的方法来使用等待/通知与 AtomicInteger 连接

转载 作者:行者123 更新时间:2023-12-01 22:14:55 24 4
gpt4 key购买 nike

我有这样的代码:

public class RecursiveQueue {
//@Inject
private QueueService queueService;
public static void main(String[] args) {
RecursiveQueue test = new RecursiveQueue();
test.enqueue(new Node("X"), true);
test.enqueue(new Node("Y"), false);
test.enqueue(new Node("Z"), false);
}

private void enqueue(final Node node, final boolean waitTillFinished) {
final AtomicLong totalDuration = new AtomicLong(0L);
final AtomicInteger counter = new AtomicInteger(0);

AfterCallback callback= new AfterCallback() {
@Override
public void onFinish(Result result) {
for(Node aNode : result.getChildren()) {
counter.incrementAndGet();
queueService.requestProcess(aNode, this);
}

totalDuration.addAndGet(result.getDuration());
if(counter.decrementAndGet() <= 0) { //last one
System.out.println("Processing of " + node.toString() + " has finished in " + totalDuration.get() + " ms");
if(waitTillFinished) {
counter.notify();
}
}
}
};

counter.incrementAndGet();
queueService.requestProcess(node, callback);
if(waitTillFinished) {
try {
counter.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

想象有一个queueService,它使用阻塞队列和几个消费者线程来处理节点=调用DAO来获取节点的子节点(它是一棵树)。因此 requestProcess 方法只是将节点排入队列并且不会阻塞。

是否有一些更好/安全的方法来避免在此示例中使用等待/通知?根据一些发现,我可以使用 Phaser(但我在 java 6 上工作)或条件(但我没有使用锁)。

最佳答案

  • 您的示例中没有任何同步任何内容。除非在 synchronized(o) {...} 内,否则不得调用 o.wait()o.notify()阻止。

  • 您对 wait() 的调用不在循环中。这在您的 JVM 中可能永远不会发生,但语言规范允许 wait() 过早返回(这称为虚假唤醒)。更一般地说,最好的做法是始终使用循环,因为它是一种熟悉的设计模式。 while 语句的成本不超过 if,并且您应该拥有它,因为可能存在虚假唤醒,而且您绝对会< em>必须在多消费者的情况下使用它,所以你最好总是这样写。

  • 由于您必须使用 synchronized block 才能使用 wait()notify(),因此可能没有理由使用Atomic任何东西。

  • 这个“递归”的事情看起来非常复杂,回调会向队列添加更多项目。能有多深?

关于java - 有没有更好的方法来使用等待/通知与 AtomicInteger 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31268850/

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