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));
1
Другие вопросы по тегам