Сбросить карту (удалить и сбросить при следующей установке) Значение по истечении срока действия ключа - PullRequest
0 голосов
/ 17 июня 2020

Мое требование - запустить таймер при вставке ключа в карту (и увеличить значение), а по истечении срока удалить ключ, но как только тот же ключ появится снова, снова запустите таймер и сбросьте значение до 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);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...