我正在实现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/

10-09 05:27