FixedThreadPool не выполняется должным образом
Я создал newFixedThreadPool размером 100 и запустил на нем 500 потоков. Все потоки запускаются правильно, и все занимают достаточно времени, которое они все должны занять. Но тогда исполнитель просто закрылся с каким-то потоком, и большинство из них нет. Я также вызвал shutdown() и awaitTermination() с максимальным значением, чтобы он дождался завершения всех потоков. Это прекрасно работает, когда число задач небольшое, например 20 или 30, с тем же размером пула, что и 100. Логика в потоке заключается в работе над списком и преобразовании этого списка в файл xlsx. Пожалуйста, поделитесь любой информацией, если кто-то сталкивался с подобной проблемой.
1 ответ
Распространенной ошибкой при отправке задач в ExecutorService является игнорирование любых возникающих ошибок. Вы должны либо;
- вызовите Future.get() для каждого Future, возвращаемого
.submit(task)
чтобы увидеть любую ошибку или - Вы должны поймать и записать все ошибки в
try { } catch (Throwable t)
блок.
Скорее всего, возникает ошибка, которая приводит к сбою всех задач.
Кстати, если у вас есть задачи, связанные с процессором, оптимальным числом потоков может быть количество процессоров, которые у вас есть.
Логика в потоке должна работать со списком и конвертировать
Гораздо более простой подход, вероятно, заключается в использовании
listToProcess.parallelStream()
.map(l -> process(l))
.forEach(row -> save(row));