Проблема скорее всего не связана с ConcurrentHashMap
. Каждый раз, когда вы put
что-то на карте, ни один другой поток не сможет put
одновременно. Так что, возможно, некоторым потокам придется подождать, пока другой не закончит работу с put
, но это не вызовет каких-либо условий гонки.
Я выполнил ваш код на своей машине, и все работает. (Нет сообщения об ошибке, печатает количество загруженных изображений). Возможно, ваш компьютер не так быстро загружает изображения, как мой, и поэтому время ожидания awaitTermination
истекает.
Насколько я могу судить, я не знаю, подходит ли ваш подход (загрузка изображений с многопоточностью) такая хорошая идея. Ваш жесткий диск (или SSD) будет узким местом, и ваши потоки в конечном итоге будут ждать жесткий диск (инструкция ImageIO.read
). Кроме того, развертывание службы исполнителя (или запуск новых потоков) не очень дешево, поэтому, возможно, вам лучше отказаться от многопоточности. Тем более, что вам нужно загрузить изображения только один раз (после этого они кэшируются на карте), поэтому ускорение, вероятно, никогда не будет значительным. Я бы подумал о последовательной загрузке изображений.