FutureTask 实现缓存

package cn.hc.sort.thread.cache;

import java.util.concurrent.ExecutionException;

/**
 * 高效缓存
 * Created by yhc on 2015/5/7.
 */
public interface Computable {
    V compute(A arg) throws InterruptedException, ExecutionException;
}




package cn.hc.sort.thread.cache;

import java.util.concurrent.*;

/**
 * 高效缓存实现
 * Created by yhc on 2015/5/7.
 */
public class Memoizer implements Computable {
    private final ConcurrentHashMap> cache=new ConcurrentHashMap>(2048);
    private final Computable computable;

    public Memoizer(Computable computable) {
        this.computable = computable;
    }



    @Override
    public V compute(final A arg) throws InterruptedException, ExecutionException {
        Future future=cache.get(arg);
        if(future==null){
            Callable eval=new Callable() {
                @Override
                public V call() throws Exception {
                    return computable.compute(arg);
                }
             };
            FutureTask ft=new FutureTask(eval);
            future=cache.putIfAbsent(arg,ft);
            if(future==null){
               future=ft;
                ft.run();
            }
        }
        return future.get();
    }
}


你可能感兴趣的:(java)