Мое требование - запустить таймер при вставке ключа в карту (и увеличить значение), а по истечении срока удалить ключ, но как только тот же ключ появится снова, снова запустите таймер и сбросьте значение до 1, а затем увеличьте его.
Значит, таймера не было бы на карте, он должен быть на клавишах. Это означает, что если K1 помещается в карту во время T1, тогда таймер запускается для K1, и если K2 помещается в карту во время T2, тогда таймер запускается для K2.
Я написал пример кода этого, но я думаю, что будет проблемой при запуске в многопоточной среде.
if(nMap.get(tf) != null){ //after this if timer gets expired and key removed then next line gives issue
nMap.get(tf).incrementAndGet();
}
Полный пример кода:
public class TestDemo {
ConcurrentHashMap<Integer, ConcurrentHashMap<String, AtomicInteger>> nwMap = null;
Timer timer = new Timer();
long timeout = 2000; // milliseconds
public void initilize(){
nwMap = new ConcurrentHashMap<Integer, ConcurrentHashMap<String, AtomicInteger>>();
nwMap.put(1, new ConcurrentHashMap<String, AtomicInteger>());
nwMap.put(2, new ConcurrentHashMap<String, AtomicInteger>());
nwMap.put(3, new ConcurrentHashMap<String, AtomicInteger>());
}
void actionAfterTimeout(String tf, int nw ) {
System.out.println("Before : "+nwMap);
nwMap.get(nw).remove(tf);
System.out.println("After: "+nwMap);
}
public void addTf(String tf, int nw){
if(nwMap.get(nw).get(tf) == null){
ConcurrentHashMap<String, AtomicInteger> nMap = nwMap.get(nw);
nMap.put(tf, new AtomicInteger(1));
timer.schedule(new TimerTask() {
@Override
public void run() {
actionAfterTimeout(tf, nw);
}
}, timeout);
}else{
ConcurrentHashMap<String, AtomicInteger> nMap = nwMap.get(nw);
if(nMap.get(tf) != null){ **<--- after this if timer gets expired and key removed then next line gives issue**
nMap.get(tf).incrementAndGet();
}
}
}
public static void main(String[] args) throws InterruptedException {
TestDemo demo = new TestDemo();
demo.initilize();
for(int i = 0;i<1000000;i++){
demo.addTf("+811111111", 1);
}
Thread.sleep(50000);
}
}