我有一个HashMap,我希望在一段时间后对HashMap中添加的条目执行特定操作。
HashMap<K,V> map = new HashMap<>();
void addEntry(K,V) {
//set timeout for the key-value pair to say 10 seconds
map.put(K,V);
}
void actionAfterTimeout(K) {
//do something
map.remove(K);
}
在超时发生后说我想做一些处理并从地图中删除条目。我该怎么办?
答案 0 :(得分:2)
使用Timer.schedule(TimerTask task, long delay)
。
HashMap<K,V> map = new HashMap<>();
Timer timer = new Timer();
long timeout = 10_000; // milliseconds
void addEntry(K key, V value) {
//set timeout for the key-value pair to say 10 seconds
map.put(key, value);
timer.schedule(new TimerTask() {
@Override
public void run() {
actionAfterTimeout(key);
}
}, timeout);
}
void actionAfterTimeout(K key) {
//do something
map.remove(key);
}
答案 1 :(得分:0)
如果您不想使用多个线程,那么这个将有效。它不是线程安全的。 它将在超时发生后首次点击地图时执行处理。
class TimedMap<K, V>
{
private Map<K, V> map = new HashMap<>();
private Map<K, Long> timerMap = new LinkedHashMap<>();
private static final Long TIMEOUT_IN_MILLIS = 10000;
public void addEntry( K key, V value )
{
checkTimeout();
map.put( key, value );
timerMap.remove( key );
timerMap.put( key, System.currentTimeInMillis() );
}
public void getEntry( K key )
{
checkTimeout();
map.get( key );
}
private void checkTimeout()
{
List<K> removals = new LinkedList<>();
for( K key : map.keySet() )
{
if( ( System.currentTimeMillis() -
timerMap.get( key ) ) >
TIMEOUT_IN_MILLIS )
{
removals.add( key );
}
else
{
break;
}
}
for( K removal : removals )
{
actionAfterTimeout( key );
}
}
private void actionAfterTimeout( K key )
{
//do something
map.remove( key );
}
}