gpt4 book ai didi

java - 在Java中将对象放入优先级队列后等待它们

转载 作者:行者123 更新时间:2023-12-01 05:53:11 28 4
gpt4 key购买 nike

我正在尝试使用多线程解决 Java 中编写者偏好的读者-编写者问题。以下是我的代码功能的精简版本。它会起作用吗?

public PriorityBlockingQueue<myClass> pq;
public void foo(){
myClass obj = new myClass();
pq.add(obj);
obj.wait();
//Actual code
}
public void bar(){
pq.remove().notify();
}

假设优先级队列 pq 最初为空,并且封闭类的构造函数调用 pq 的构造函数。此外,foo 首先由一个线程调用,然后由另一个线程调用 bar。因此,当调用 foo 时,它将 obj 添加到队列中,并成为前面的元素,这样当在 bar 中调用remove 时,它​​就是被删除的元素。我的问题是,“实际代码”会被执行吗?或者我是在两个完全不同的对象上执行 wait() 和 notification() 吗?如果是这样,我该如何解决它?

最佳答案

我看到的主要问题是线程可能会被虚假唤醒......因此您应该始终拥有一些与条件相关的数据。另外,notifyAll() 不太可能导致死锁......所以:

public void foo() {
MyClass obj = new MyClass();
pq.add(obj);
synchronized(obj) {
while (!obj.isDoneBeingProcessed()) {
obj.wait();
}
}
}

public void bar() {
MyClass next = pq.remove();
if (!next) {
return;
}
next.doProcessing();
synchronized(next) {
next.setDone(true);
next.notifyAll();
}
}

但请注意,这段代码实际上没有意义,因为它本质上序列化了整个计算。如果您要将所有内容放入一个线程中,而在另一个线程中进行处理,然后......仅在最后或在另一个线程中尝试等待所有内容,那么这会更有意义。在生成所有内容之前将等待置于生产者阶段,可以有效地序列化整个计算。

关于java - 在Java中将对象放入优先级队列后等待它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3938606/

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