ConcurrentHashMap удаляет проблему с потоком

Сейчас я что-то делаю с Java ConcurrentHashMap. У меня проблемы с многопоточной средой.

Мой код: 1. Добавление объекта Runnable в ConcurrentHashMap.

private Map<String, ScheduledFuture<?>> scheduledTasks = new ConcurrentHashMap<>();
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        AA();
    }
};
ScheduledFuture<?> task = taskScheduler.scheduleAtFixedRate(runnable, 10); 
scheduledTasks.put(taskId, task);
  1. Удаление объекта Runnable в ConcurrentHashMap.
    if (scheduledTasks.get(taskId) != null && !"".equals(scheduledTasks.get(taskId))
    {
        scheduledTasks.get(taskId).cancel(true);
        scheduledTasks.get(taskId).remove();
    }

Простое добавление или удаление не вызывает проблем, и если я печатаю scheduledTasks.keySet() в консоль или в файл журнала, он печатает правильный результат.

Однако проблема заключается в том, что после удаления исполняемого объекта с Карты некоторые исполняемые объекты все еще работают (даже несмотря на то, что на Карте больше нет этого исполняемого объекта!).

Я действительно не уверен, в чем проблема. Не хватает ли мне понимания «многопоточной среды Java»? Или... эта проблема связана с ScheduledFuture?


person WHITE.C    schedule 11.09.2019    source источник
comment
Почему удаление потока с карты останавливает его выполнение?   -  person Robby Cornelissen    schedule 11.09.2019
comment
В основном то, что спросил @RobbyCornelissen. ConcurrentHashMap — это структура данных с потокобезопасностью, она ничего не говорит о выполнении задач. Другими словами, удаление задачи с карты не останавливает выполнение задачи, а также не удаляет запланированный исполняемый объект (сборки мусора нет, поскольку запланированное означает, что на него есть ссылка на что-то еще).   -  person Logain    schedule 11.09.2019


Ответы (1)


Вы также можете сделать это следующим образом:

ExecutorService exe = Executors.newFixedThreadPool(10);
CountDownLatch taskLatch = new CountDownLatch(10);
List<Callable Interface Instance> loadingTasks = new ArrayList<Callable Interface Instance>();
//create instance of Callable Interface Instance
loadingTasks.add(task);// where task will be Callable Interface Instance/reference name

List<Future<Boolean>> futures = exe.invokeAll(loadingTasks);
boolean complete = taskLatch.await(5, TimeUnit.MINUTES); //waiting for tasks to be completed

for (Future<Boolean> f : futures) {
taskComplete = f.get(); //get callable interface instance call method return value
}
person aks    schedule 11.09.2019