我正在实现Future
接口用于共享计算。即一个线程执行计算,其他线程需要相同的结果,只需通过Future
进行请求。因此,我阅读了Object#wait()方法文档,并确定该文档完全满足我的需求。这是我的Future#get()方法实现的外观:
public class CustomFuture implements Future<Collection<Integer>> {
private AtomicBoolean started;
private Exception computationException;
private boolean cancelled;
private Collection<Integer> computationResult;
private Object waitForTheResult = new Object();
public Collection<Integer> get(){
if(started.compareAndSet(false, true))
//start the computation //notifyAll() is called after finishing the computation here.
while(computationResult == null){
if(cancelled)
throw new CancellationException();
if(computationException != null)
throw new ExectuonException();
synchronized(waitForTheResult){
waitForTheResult.wait();
}
}
return computationResult;
}
//The rest of methods
}
我不确定实现是否良好,因为它依赖于底层的原语。我认为,作为经验法则,我们应该避免使用这样的低级基元。也许这是合理的情况。
也许在
wait()
中有一个更好的java.util.concurrent
替代方法。 最佳答案
否可以使用低级同步功能。
在您的代码中,我看不到通知。如果您进入等待状态,则另一个线程需要通知以唤醒等待的线程。
如果waitForTheResult
是私有的Object
,则可能无法从外部访问它,那么当计算结果时如何实现通知?
关于java - 使用诸如等待之类的低级基元是否被认为是不好的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32844505/