本 Concurrency in Practice (Brian Goetz 著) に記載されているキャッシュの実装を拡張しようとしています。
エントリが 10 秒以内にアクセスされない場合は期限切れになるようにキャッシュを拡張したいと考えています。つまり、キャッシュから削除されます。
このために、以下のように Future と FutureTask を拡張しました
package examples.cache;
import java.util.concurrent.Future;
public interface FutureWithExpire<V> extends Future<V> {
public boolean isResultExpired();
}
と
package examples.cache;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class FutureTaskWithExpire<V> extends FutureTask<V> implements FutureWithExpire<V>{
private final static long validPeriod = 10 * 1000;
private long expirationTime;
public FutureTaskWithExpire(Callable<V> callable) {
super(callable);
}
@Override
public V get() throws InterruptedException,ExecutionException{
V v = super.get();
expirationTime = System.currentTimeMillis() + validPeriod;
return v;
}
public boolean isResultExpired(){
if(isDone()){
if(expirationTime < System.currentTimeMillis()){
return true;
}
}
return false;
}
}
上記のように、有効期限を計算するために get メソッドをオーバーライドしています。
メイン キャッシュ クラス、つまりMemorizerisResultExpired
では、エントリを定期的にスキャンし、 true を返すエントリを削除する新しいスレッドを開始します。
この実装が機能するかどうか、またはコードにバグがあるかどうかを知りたかっただけですか?
get を Timeout でオーバーライドする必要があることに注意してください。ただし、簡潔にするために、それを省略しました。