为HashMap中存在的每个条目设置超时

时间:2014-07-09 04:56:29

标签: java timertask

我有一个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);
}

在超时发生后说我想做一些处理并从地图中删除条目。我该怎么办?

2 个答案:

答案 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 );
    }
}