Подскажите по задачке: Знакомство с ThreadPoolExecutor.
Не проходит условие 2: "В цикле добавь в очередь 10 задач Runnable".
"Ошибку" я понял, использую метод "put", а не "add"(унаследованный от AbstractQueue).
В связи с чем вопрос: а в реальности какой метод нужно использовать? Ведь по сути, разница в том, что "add" кидает исключение если нет места в очереди, а "put" ждет появление этого места.
Но условие "ДОБАВИТЬ задачи в очередь", а не "ПОПРОБОВАТЬ добавить")
Всё зависит от того, какого поведения ты хочешь добиться. Например метод put() у интерфейса BlockingQueue гарантировано добавит задачу в очередь. Но при этом он является блокирующим, и если задач много, они тяжеловесные и потоки из пула с ними не справляются, приложение просто повиснет. Метод add() наоборот, реализован неблокирующим, и в случае, когда очередь переполнена, он выбросит IllegalStateException. Но при этом сохраняется возможность повесить на пул потоков обработчик отклонённых задач при помощи метода setRejectedExecutionHandler() класса ThreadPoolExecutor. Например, можно их собрать в коллекцию, после чего снова попытаться позже отправить на исполнение. Соответственно, использование метода add() является более гибким подходом.
О, это замечательные утилиты для многопоточности. Немного имел ранее с ними дело. Очень мощные, хорошо настраивать, и простые в применении. Также там замечательные есть классы/интерфейсы Callable и Future и Completablefuture, для асинхроннки, вещь просто незаменимая и необычайно гибкая.
Описание задач супер! Бывали задачи намного проще и легче, где я смотрела готовое решение, просто потому, что ни фига не поняла что хотят. А эти хоть и сложные в понимании материала,но решила сама с удовольствием.
это очень странно, потому что у меня на 03.10.2022 написано, что "Всего эту задачу решили 5599 учеников."
Задача называется "ShutdownNow!" из пакета package com.javarush.task.task28.task2812;
put()у интерфейсаBlockingQueueгарантировано добавит задачу в очередь. Но при этом он является блокирующим, и если задач много, они тяжеловесные и потоки из пула с ними не справляются, приложение просто повиснет. Методadd()наоборот, реализован неблокирующим, и в случае, когда очередь переполнена, он выброситIllegalStateException. Но при этом сохраняется возможность повесить на пул потоков обработчик отклонённых задач при помощи методаsetRejectedExecutionHandler()классаThreadPoolExecutor. Например, можно их собрать в коллекцию, после чего снова попытаться позже отправить на исполнение. Соответственно, использование методаadd()является более гибким подходом.