У нас есть сценарий, в котором задачи, переданные ThreadPoolExecutor, выполняются долго. Когда пул потоков запущен, мы запустим его с размером пула ядра = 5, максимальным размером пула = 20 и размером очереди 10. В нашем приложении подано 10 задач. Большую часть времени эти задачи выполняются в течение нескольких минут/час, а затем завершаются. Однако была ситуация, когда все 5 заданий были повесили на ввод-вывод. В результате размер основного пула достиг максимального значения, но моя очередь Threadpoolexecutor не была заполнена. Таким образом, дополнительные 5 задач никогда не имели шансов на успех. Пожалуйста, подскажите, как мы можем справиться с таким сценарием? Имеет ли меньшая очередь лучший вариант в такой ситуации? Каким будет оптимальный размер очереди при инициализации threadPool?ThreadPoolExecutor: задачи ставятся в очередь и не отправляются
Также в отношении повешенных задач есть ли способ вытащить потоки из Threadpool? В этом случае, по крайней мере, другие задачи получат шанс запустить.
Когда вы отправляете() задачу, вам возвращается объект Future. Вы можете использовать этот будущий объект для отмены выполнения. – Aurand
Да, мы делаем это, используя future.cancel. Однако не гарантируется, что задачи будут отменены в ожидании ввода/вывода. – user1269597
вы можете установить значение тайм-аута при получении значения с помощью объекта Future как 'future.get (5000, TimeUnit.MILLISECONDS)' и записать его в блок 'try catch'. –