@murakas
Программист

Как правильно организовать работу в многопоточной программе?

Есть приложение, которое порождает некоторое количество потоков с помощью ExecutorService. Каждый поток - это одна задача, для идентификации у задачи есть id. В один момент времени не могут существовать две задачи (потока) с одним и тем же id.
Как изящно выйти из ситуации?
У меня на уме использовать Collections.synchronizedList(new ArrayList<>()) объект которого передавать в метод "задачи", а после того как задача выполнится в конце удалить из списка запись с соответствующим id.
  • Вопрос задан
  • 99 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vamp
@Vamp
List не подойдёт, так как вам на нем придется делать две отдельные независимые операции - contains и add. При неудачном тайминге два потока, взявших одинаковый id задачи, могут одновременно запросить contains и получить false. А потом одновременно добавят один и тот же id.

Вам больше подойдёт Set.
Set<Integer> executingJobs = ConcurrentHashMap.newKeySet();

Метод add возвращает boolean, который и нужно проверять для определения наличия уже выполняемой задачи с таким же id.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
SberTech Москва
от 300 000 до 435 000 ₽
Сбер Новосибирск
До 208 000 ₽
27 янв. 2022, в 23:40
3000 руб./за проект
27 янв. 2022, в 23:28
26400 руб./за проект
27 янв. 2022, в 23:17
105400 руб./за проект