首先,我在Java 8工作。
我有一个异步任务,可以生成这个对象:
class Result {
private AtomicBoolean isComplete = new AtomicBoolean(false)
private Queue<String> state = new ConcurrentLinkedQueue<>();
public Queue<String> getState() {
return state;
}
public void setComplete() {
isComplete.set(true);
notifyAll();
}
public void waitUntilComplete() {
if (isComplete.get()) {
return;
}
wait();
}
}
我希望可以选择阻止,直到任务完成。我在考虑使用.wait()
和.notifyAll()
。
我无法使用未来,因为我在任务执行期间访问当前状态。
这是不好的做法:
.wait()
和.notifyAll()
是Object.class
上的公开方法。答案 0 :(得分:1)
据我所知,如果你正确使用它们,使用wait
,notify
,notifyAll
方法并不是一种坏习惯。看来你没有正确使用它们。显然,你要么不清楚你想要达到什么目标,要么如何实现它(通过使用这些方法)。
我认为你需要这些方面的东西(下面的代码)
此外,似乎您可以使用LOCK
代替this
(在您的情况下)
因此,您可以制作完整的两种方法synchronized
(隐含地表示synchronized
)监视器上的this
。
class Result {
private boolean isComplete = false;
private static final Object LOCK = new Object();
public void setComplete() {
synchronized(LOCK){
isComplete = true;
LOCK.notifyAll();
}
}
public void waitUntilComplete() {
synchronized(LOCK){
while (!isComplete) {
LOCK.wait();
}
// do what you need to do when
// complete is already equal to true
}
}
}