2020-03-18 18:12:50 +00:00
|
|
|
package com.terraforged.core.util.concurrent.cache;
|
|
|
|
|
|
|
|
import java.util.concurrent.Executor;
|
2020-03-20 09:36:13 +00:00
|
|
|
import java.util.function.Supplier;
|
2020-03-18 18:12:50 +00:00
|
|
|
|
2020-03-20 09:36:13 +00:00
|
|
|
public class CacheEntry<T> implements Runnable, ExpiringEntry {
|
2020-03-18 18:12:50 +00:00
|
|
|
|
2020-03-20 09:36:13 +00:00
|
|
|
private volatile T result;
|
2020-03-18 18:12:50 +00:00
|
|
|
private volatile long timestamp;
|
|
|
|
|
2020-03-20 09:36:13 +00:00
|
|
|
private final Supplier<T> supplier;
|
|
|
|
|
|
|
|
private CacheEntry(Supplier<T> supplier) {
|
|
|
|
this.supplier = supplier;
|
2020-03-18 18:12:50 +00:00
|
|
|
this.timestamp = System.currentTimeMillis();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public long getTimestamp() {
|
|
|
|
return timestamp;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-20 09:36:13 +00:00
|
|
|
public void run() {
|
|
|
|
this.result = supplier.get();
|
|
|
|
this.timestamp = System.currentTimeMillis();
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isDone() {
|
|
|
|
return result != null;
|
|
|
|
}
|
|
|
|
|
2020-03-18 18:12:50 +00:00
|
|
|
public T get() {
|
2020-03-20 09:36:13 +00:00
|
|
|
T value = result;
|
|
|
|
if (value == null) {
|
|
|
|
value = getNow();
|
2020-03-18 18:12:50 +00:00
|
|
|
}
|
2020-03-20 09:36:13 +00:00
|
|
|
return value;
|
|
|
|
}
|
|
|
|
|
|
|
|
private T getNow() {
|
|
|
|
T result = supplier.get();
|
|
|
|
this.result = result;
|
|
|
|
return result;
|
2020-03-18 18:12:50 +00:00
|
|
|
}
|
|
|
|
|
2020-03-20 09:36:13 +00:00
|
|
|
public static <T> CacheEntry<T> supplyAsync(Supplier<T> supplier, Executor executor) {
|
2020-03-18 18:12:50 +00:00
|
|
|
CacheEntry<T> entry = new CacheEntry<>(supplier);
|
|
|
|
executor.execute(entry);
|
|
|
|
return entry;
|
|
|
|
}
|
|
|
|
}
|