《实践Java并发》中的Memoizer3.java问题

时间:2020-10-13 07:12:41

标签: java concurrency

关于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);
        }
    }

0 个答案:

没有答案