БИЛЕР НИЗКИ - это практичный инструмент для сбора задач параллельно. С введением многоядерных архитектур, подходящих для параллелизации применения, роль пулов потоков становится все более очевидной. Через класс ThreadPoolexeCutor и другие вспомогательные классы Java 5 представила эту структуру в качестве нового раздела поддержки параллелизма.
Структура ThreadPoolexeCutor является гибкой и мощной. Он поддерживает конкретные конфигурации пользователя и предоставляет соответствующие крючки и политики насыщения для обработки полных очередей.
Пул ниток Java поместит представленные задачи сначала в очередь работы и получить их из рабочей очереди (SynchronousQueue представляет производитель непосредственно в рабочую ветку). Затем есть две стратегии реализации для рабочих очередей: неограниченные очереди и ограниченные очереди. Нет проблем с насыщением в неограниченной очереди, но проблема заключается в том, что, когда запрос продолжает быть высоким, задача будет добавлена в очередь работы без мозговой кости, что может привести к переполнению или другим ресурсам, что может привести к переполнению или выхлопению. Ограниченные очереди не приведут к истощению памяти, вызванной высокой нагрузкой, но существует проблема с тем, как управлять вновь представленными задачами, когда рабочая очередь полна. Это проблема, которую необходимо решить стратегию насыщения рабочих очередей.
Стратегии насыщения делятся на: стратегию прерывания, стратегию Callerruns, стратегию отказа и стратегию отключения.
Для лучшего понимания я написал небольшой пример.
Package condurance.pool; import java.util.concurrent.linkedblockingDeque; import java.util.concurrent.rejectedexecutionhandler; импорт java.util.concurrent.threadpoolexecutor; import java.util.concurrent.timeUnit; Ведите в рамках различных политик насыщенности* @param обработчиков пула в пуле рабочих очередей*/Public Static Void Policy (DiecuceedExecutionHandler обработчик) {// Существуют 2 основных нити, максимальное количество потоков составляет 3, а рабочая очередь - 5. LinkedBlockingDeque <> (5)); if (Handler! = Null) {exec.setrejectedExecutionHandler (Handler); // SET POLICE} для (int i = 0; i <10; i ++) {exec.submit (new Task ()); // отправлять задание} exec.shutdow ThreadPoolExecutor.AbortPolicy());// policy((new ThreadPoolExecutor.CallerRunsPolicy()));// policy(new ThreadPoolExecutor.DiscardPolicy());// policy(new ThreadPoolExecutor.DiscardOldestPolicy());}// Custom task static class Task implements Runnable {private static int count = 0; private int id = 0; // Идентификатор задачи public task () {id = ++ count;}@переопределить public void run () {try {timeUnit.seconds.selep (3); // Сон в течение 3 секунд} catch (прерывание {system.err.println ("нить была прерывана" + e.getmessage (); "/T Taker Tread:" + Thread.currentThread (). getName () + "Завершено");}}} Когда рабочая очередь полна, различные стратегии обрабатываются следующим образом:
1. АБОРТА ПОЛИТИКА: Политика по умолчанию. Когда новая задача будет представлена, неконтролируемое исключение прямо брошено. Исключение может быть пойман вызывающим абонент.
Добавьте следующий код в основную функцию:
Политика (New ThreadPoolexeCutor.Abortpolicy ());
Результатом работы:
Программа бросает decuceedExecutionException, и в общей сложности выполняется 8 задач (пул потоков может выполнять 3 задачи в начале, а 5 очередей хранятся в рабочей очереди). Когда очередь работы заполнена, непосредственно выбрасывается исключение, а JVM не выходит (я не знаю, почему сейчас). Мы видим, что все потоки, которые выполняют задачи, представляют собой потоки в пуле потоков.
2. Стратегия Callerruns: для механизма корректировки не отказывается от задач и не бросает исключения, но возвращается к вызывающему. Новая задача не выполняется в пуле потоков, а в потоке вызывает выброс.
Запустить в основной функции:
Политика ((New ThreadPoolexeCutor.callerrunSpolicy ()));
Результаты бега
Все задачи выполняются, а в основном потоке выполняются 2 (10 - 3 -5) задачи, а 8 задач выполняются потоками в пуле потоков.
3. Дискарная стратегия: вновь представленные задачи заброшены.
Запустить в основной функции
Политика (New ThreadPoolexeCutor.discardPolicy ());
Приведенные выше результаты показывают, что никаких исключений не брошено, 2 новых задачи, представленные позже, отбрасываются, и обрабатываются только первые 8 (3+5) задач, а JVM выходит.
4. DiscardOLDEST Стратегия: очередь является задачей «главы команды», а затем попытаться подать новую задачу. (Не подходит для сценариев очереди работы в качестве приоритетных очередей)
Запустите следующий метод в основной функции
Политика (New ThreadPoolexeCutor.discardEldestPolicy ());
Результат работы: в общей сложности 8 задач. Программа заканчивается. Задачи, добавленные позже, составляют 9 и 10, а предыдущие задачи 3 и 4 отброшены.
Суммировать
Выше приведено все содержание этой статьи о примере кода стратегии насыщения рабочих очередей в пуле Java. Я надеюсь, что это будет полезно для всех. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте.