Сейчас я что-то делаю с 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);
- Удаление объекта Runnable в ConcurrentHashMap.
if (scheduledTasks.get(taskId) != null && !"".equals(scheduledTasks.get(taskId))
{
scheduledTasks.get(taskId).cancel(true);
scheduledTasks.get(taskId).remove();
}
Простое добавление или удаление не вызывает проблем, и если я печатаю scheduledTasks.keySet()
в консоль или в файл журнала, он печатает правильный результат.
Однако проблема заключается в том, что после удаления исполняемого объекта с Карты некоторые исполняемые объекты все еще работают (даже несмотря на то, что на Карте больше нет этого исполняемого объекта!).
Я действительно не уверен, в чем проблема. Не хватает ли мне понимания «многопоточной среды Java»? Или... эта проблема связана с ScheduledFuture
?
ConcurrentHashMap
— это структура данных с потокобезопасностью, она ничего не говорит о выполнении задач. Другими словами, удаление задачи с карты не останавливает выполнение задачи, а также не удаляет запланированный исполняемый объект (сборки мусора нет, поскольку запланированное означает, что на него есть ссылка на что-то еще). - person Logain   schedule 11.09.2019