关于Memoizer3.java
我更改了注释标记的代码。我的问题是,如果我们不认为任务失败或取消,它是否运作良好? 在我的单元测试中,它就像Memoizer.java一样运作良好。
public class Memoizer3<A, V> implements Computable<A, V> {
private final Map<A, Future<V>> cache = new ConcurrentHashMap<A, Future<V>>();
private final Computable<A, V> c;
public Memoizer3(Computable<A, V> c) {
this.c = c;
}
@Override
public V compute(final A arg) throws InterruptedException {
Future<V> f = cache.get(arg);
if (f == null) {
Callable<V> eval = new Callable<V>() {
@Override
public V call() throws Exception {
return c.compute(arg);
}
};
FutureTask<V> ft = new FutureTask<V>(eval);
f = cache.put(arg, ft);// change this 1
if (f == null) {// change this 2
f = ft;
ft.run();//
}
}
try {
V result = f.get();
return result;
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
}