Man*_*wam 1 java executorservice
我正在使用expiry. 我正在使用 aScheduledThreadExecutor来安排从缓存中删除条目。我的问题是执行程序永远不会关闭。我已经尝试过executor.shutdown()方法,shutdownHook但即使在我的主程序完成执行之后它也没有被执行。我也不喜欢终结器。我的代码如下。我希望在closeCache()主程序退出时执行该方法。
public class TimeCacheManual<K,V> {
private final int maxSize;
private final long timeToLive;
private Map<K, V> keyValueMap;
private Map<K,ScheduledFuture > keySchedulerMap;
private Queue<K> keys;
private final ScheduledExecutorService scheduler;
/*
* creates new instance of TimeBasedEvictionCache.
* @param maxSize must be greater than zero
* @param timeToLive must be greater than zero
* @throws IllegalArgumentException if {@code maxSize<1||timeToLive<1}
* */
public TimeCacheManual(int maxSize,long timeToLive) {
if(maxSize<1||timeToLive<1){
throw new IllegalArgumentException();
}
this.maxSize = maxSize;
this.timeToLive = timeToLive;
keyValueMap = new ConcurrentHashMap<K, V>(maxSize);
keySchedulerMap = new ConcurrentHashMap<K, ScheduledFuture>(maxSize);
keys = new ConcurrentLinkedQueue<K>();
scheduler = Executors.newScheduledThreadPool(maxSize);
}
/*
* adds a key value pair to the cache.
* @param key
* @param value associated with key
*/
public synchronized void put(K key,V value) {
if (keyValueMap.containsKey(key)) {
refreshKey(key);
}
else{
keys.add(key);
}
keyValueMap.put(key, value);
scheduleEviction(key); // schedules eviction of the key after timeToLive
}
/*
* schedules eviction of particular key after timeToLive
* @param key
*/
private void scheduleEviction(final K key){
ScheduledFuture sf= scheduler.schedule( new Runnable(){
@Override public void run(){
keys.remove(key);
keyValueMap.remove(key);
}
},
timeToLive,
TimeUnit.MILLISECONDS);
keySchedulerMap.put(key,sf );
}
/*
* used to get a value associated with a given key. returns null if no value is associated with given key
* @param key
* @return value associated with key, null if no value is associated with particular key
*/
public synchronized V get(K key) {
refreshKey(key);
scheduleEviction(key);
return keyValueMap.get(key);
}
/*
* updates the order of keys according to a particular policy
* @param key to be refreshed
*/
private void refreshKey(K key){ // refreshing the order of keys
keySchedulerMap.get(key).cancel(true) ;
keys.remove(key); //LRU policy
keys.add(key);
}
public void closeCache(){
scheduler.shutdownNow() ;
}
Run Code Online (Sandbox Code Playgroud)
}
感谢回复。我正在创建一个图书馆。所以它不会知道什么时候调用,executor.shutdown()除非库的用户显式调用shutdown(). 无论如何我得到了解决方案。我将执行程序设置为守护线程,以便在主程序退出时它会自动终止。下面给出了制作守护进程执行器的代码
scheduler = Executors.newScheduledThreadPool(maxSize,new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
});
Run Code Online (Sandbox Code Playgroud)
谢谢你们。希望这会帮助某人