자바 병렬 프로그래밍 실전에서 언급한 간단한 캐시 시스템

1793 단어
이것은 자바 병렬 프로그래밍에서 언급한 간단한 캐시 시스템입니다. 본인 코드가 아닙니다. 저는 아직 이렇게 높은 수준이 아닙니다.
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;


interface Computable<K,V>{
	V compute(final K arg);
}

/**
 *         
 * @author mzy
 *
 * @param <K> key
 * @param <V> value
 */
public class FutureCache<K,V> implements Computable<K,V>{
	private final ConcurrentHashMap<K, Future<V>> cache = new ConcurrentHashMap<K ,Future<V>>();
	private final Computable<K, V> c;
	public FutureCache(Computable<K, V> c) {
		this.c = c;
	}
	
	@Override
	public V compute(final K key) {
		while(true){
			Future<V> future = cache.get(key);
			if(future == null){
				Callable<V> eval = new Callable<V>() {
					@Override
					public V call() throws Exception { return c.compute(key); }
				};
				FutureTask<V> ftask = new FutureTask<V>(eval);
				//  putIfAbsent         if(future == null)         
				future = cache.putIfAbsent(key, ftask);
				if(future == null) { future = ftask; ftask.run(); }
			}
			try {
				return future.get();
			} catch (InterruptedException e) {
				//          cache   Future,      
				cache.remove(key,future);
			} catch (ExecutionException e) {
				//          ,      
				throw new RuntimeException(e.getCause());
			}
		}
	}
	
}

다음은 테스트 클래스입니다.
절망의 팔피

좋은 웹페이지 즐겨찾기