— Привет, Амиго!
16
Задача
Java Multithreading,
8 уровень,
8 лекция
Недоступна
Знакомство с Executors
1. В методе main создай фиксированный пул из 5 трэдов используя класс Executors.
2. В цикле отправь на исполнение в пул 10 задач Runnable.
3. У каждой задачи в методе run вызови метод doExpensiveOperation с порядковым номером задачи начиная с 1, см. пример вывода.
4. Запрети добавление новых задач н
16
Задача
Java Multithreading,
8 уровень,
8 лекция
Недоступна
Знакомство с ThreadPoolExecutor
1. В методе main создай очередь LinkedBlockingQueue<Runnable>.
2. В цикле добавь в очередь 10 задач Runnable.
3. У каждой задачи в методе run вызови метод doExpensiveOperation с порядковым номером задачи начиная с 1, см. пример вывода.
4. Создай объект ThreadPoolExecutor со следующими параметрами:
-
9
Задача
Java Multithreading,
8 уровень,
8 лекция
Недоступна
ShutdownNow!
Разберись в чем отличие методов shutdown и shutdownNow. Выведи список всех незавершенных задач на экран.
Должно получиться что-то вроде:
pool-1-thread-1, localId=1
pool-1-thread-2, localId=2
pool-1-thread-3, localId=3
pool-1-thread-4, localId=4
pool-1-thread-5, localId=5
java.util.concurrent.Future
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
put()у интерфейсаBlockingQueueгарантировано добавит задачу в очередь. Но при этом он является блокирующим, и если задач много, они тяжеловесные и потоки из пула с ними не справляются, приложение просто повиснет. Методadd()наоборот, реализован неблокирующим, и в случае, когда очередь переполнена, он выброситIllegalStateException. Но при этом сохраняется возможность повесить на пул потоков обработчик отклонённых задач при помощи методаsetRejectedExecutionHandler()классаThreadPoolExecutor. Например, можно их собрать в коллекцию, после чего снова попытаться позже отправить на исполнение. Соответственно, использование методаadd()является более гибким подходом.