2014-12-03 23 views
-1

使用Future这样的:并发性未来 - 如果get()已经完成,它会被调用吗?

public class Foo implements Future<Object>{ 
    boolean done=false; 
    public boolean isDone(){ 
    return done; 
    } 
    public Object get(){ 
    done = true; 
    return "hi"; 
    } 
} 

被称为get()无论如何两次?

+1

我不明白。你的例子里叫'get'的地方在哪里?为什么会被调用两次? – 2014-12-03 14:43:49

+0

请显示更多代码。 – javaHunter 2014-12-03 14:44:42

+1

正常情况下,期货表示由执行程序执行时返回的异步任务。典型的用法是提交一个任务,得到一个Future,如果你做future.get(),实现将会阻塞直到计算完成。我不确定你在什么环境下使用它。更多关于这里的正常用法:http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html – Blitzkr1eg 2014-12-03 14:48:11

回答

1

对于get很有可能(在多线程环境中很常见)被很多线程调用。

如果您希望实现Future<V>你必须实现完整的合同 - 包括:

Future ......结果只能使用方法get当计算完成检索,如果有必要,直到它阻塞准备。

因此,您必须确保呼叫get会阻止任务完成,然后传递任务结果。

+0

太糟糕了,我希望让'ExecutorService'同步到类的实例并让他自己缓存结果。 – 2014-12-03 15:06:52

相关问题