Галерея диаграмм связей Карта знаний о системе параллелизма Java (параллельное программирование)
Это карта знаний о системе параллелизма Java (параллельное программирование), включая очередь блокировки, основы параллелизма, блокировки, модель памяти JAVA и другие аспекты знаний.
Отредактировано в 2023-11-06 19:35:07Параллельное программирование
Модель памяти Java (JMM)
Механизм связи потоков
совместное использование памяти
Внедрение Java
обмен сообщениями
модель памяти
Изменение порядка
Для обеспечения производительности программы процессор и компилятор изменят порядок ее выполнения.
состояние
Результаты выполнения программы не могут быть изменены в однопоточной среде.
Изменение порядка не допускается, если существуют зависимости данных.
вопрос
Изменение порядка может привести к небезопасным данным в многопоточной среде.
последовательная согласованность
Теоретическая эталонная модель в многопоточной среде
Обеспечивает надежные гарантии видимости памяти для программ.
характеристика
Все операции в потоке должны выполняться в порядке программы.
Все потоки могут видеть только один порядок выполнения операций, независимо от того, синхронизирована программа или нет.
Каждая операция должна выполняться атомарно и быть немедленно видна всем потокам.
случается-раньше
Основная теория JMM обеспечивает видимость памяти.
В JMM, если результаты одной операции должны быть видны другой операции, между двумя операциями должна быть связь «происходит до».
теория
Если одна операция происходит раньше другой операции, то результаты выполнения первой операции будут видны второй операции, а порядок выполнения первой операции будет перед второй операцией.
Существование связи «происходит до» между двумя операциями не означает, что они должны выполняться в порядке, указанном принципом «происходит до». Если результат выполнения после переупорядочения согласуется с результатом выполнения в соответствии с отношением «происходит до», то такое переупорядочение не является незаконным.
как будто сериал
Все операции можно переупорядочить для оптимизации, но вы должны гарантировать, что результаты переупорядочения не могут быть изменены.
синхронизированный
Синхронизация, тяжелый замок
принцип
Synchronized может гарантировать, что при запуске метода или блока кода только один метод может одновременно войти в критическую секцию. Он также может гарантировать видимость общих переменных в памяти.
блокировать объект
Обычный метод синхронизации, блокировкой является текущий объект экземпляра.
Метод статической синхронизации, блокировкой является объект класса текущего класса
Блок синхронизированного метода, блокировкой является объект внутри скобок.
Механизм реализации
Заголовок объекта Java
Синхронизированная блокировка хранится в заголовке объекта Java.
Включает две части данных
Отметить слово (отметить поле)
Mark Word спроектирован как нефиксированная структура данных для хранения как можно большего количества данных в очень небольшом пространстве. Он будет повторно использовать собственное пространство хранения в зависимости от состояния объекта.
включать
Хэш-код (HashCode), возраст генерации GC, флаг состояния блокировки, блокировка, удерживаемая потоком, смещенный идентификатор потока, смещенная метка времени
Klass Pointer (указатель типа)
монитор
Владелец
Первоначально NULL означает, что ни один поток в настоящее время не владеет записью монитора. Когда поток успешно владеет блокировкой, уникальный идентификатор потока сохраняется. Когда блокировка снимается, ему присваивается значение NULL.
Оптимизация блокировки
спин-блокировка
Поток ожидает некоторое время и не будет немедленно приостановлен, чтобы увидеть, освободит ли поток, удерживающий блокировку, скоро блокировку (циклический метод).
Количество спин-слов трудно контролировать (-XX:preBlockSpin)
Экзистенциальная теория: потоки часто приостанавливаются и просыпаются с большой нагрузкой. Можно считать, что каждый поток удерживает блокировку в течение короткого времени, и выигрыш перевешивает выигрыш после приостановки и последующего пробуждения потока.
недостаток
Количество вращений не может быть определено
адаптивная блокировка вращения
Количество вращений больше не фиксировано. Оно определяется временем предыдущего вращения на том же замке и статусом владельца замка.
Если вращение прошло успешно, количество вращений можно увеличить. Если получение замка часто не удается, количество вращений будет уменьшено.
устранение блокировки
Если конкуренции данных нет, JVM устранит механизм блокировки.
Решения, основанные
Переменный выход
шероховатость замка
Объедините несколько последовательных операций запирания и разблокировки, чтобы превратить их в более крупный замок. Например, получение блокировки внутри цикла for.
легкий замок
Уменьшите потребление производительности, вызванное традиционными тяжелыми блокировками, используя мьютексы операционной системы без многопоточной конкуренции.
Получение и снятие блокировок через CAS
основа производительности
Для большинства замков не будет конкуренции на протяжении всего жизненного цикла.
недостаток
В многопоточной среде его эффективность работы ниже, чем у тяжелых блокировок.
блокировка смещения
Чтобы свести к минимуму ненужные облегченные пути выполнения блокировки без многопоточной конкуренции.
В основном избегайте ненужных операций CAS. Если блокировка соревнований не работает, обновите ее до облегченной блокировки.
изменчивый
характеристика
Видимость изменчивой переменной: при чтении изменчивой переменной вы всегда можете увидеть окончательную запись в эту переменную.
изменчивая атомарность: изменчивая является атомарной для одиночного чтения/записи (32-битная длина, двойная), за исключением составных операций, таких как i;
Механизм реализации
барьер памяти
семантика памяти
При записи изменчивой переменной JMM немедленно обновит значение общей переменной в локальной памяти, соответствующее потоку, в основную память.
При чтении изменчивой переменной JMM устанавливает недействительную локальную память, соответствующую потоку, и читает общую переменную непосредственно из основной памяти.
семантика операционной системы
Основная память, кеш (частный поток) согласован?
решение
Добавив LOCK# к шине
Через протокол когерентности кэша (протокол MESI)
модель памяти
Изменение порядка
случается-раньше
ДКЛ
Шаблон синглтон
ДКЛ
Изменение порядка
случается раньше
решение
летучий раствор
Отключить изменение порядка
Решение на основе инициализации класса
Используйте механизм classloder, чтобы гарантировать, что при инициализации экземпляра существует только один поток. JVM получит блокировку на этапе инициализации класса. Эта блокировка может синхронизировать инициализацию одного и того же класса несколькими потоками.
Основы параллелизма
АКС
AbstractQueuedSynchronizer, синхронизатор, реализует основные базовые компоненты JUC.
Решено большое количество детальных проблем, связанных с реализацией синхронизаторов в подклассах, таких как получение статуса синхронизации и очереди синхронизации FIFO.
Используя шаблон метода шаблона, AQS реализует большое количество общих методов, а подклассы реализуют свои абстрактные методы посредством наследования для управления состоянием синхронизации.
Очередь синхронизации CLH
Двунаправленная очередь FIFO, AQS использует ее для решения проблемы управления состоянием синхронизации.
Первый узел просыпается и ожидает добавления очереди в конец очереди синхронизации CLH.
Синхронное получение и освобождение состояния
Эксклюзивный
Получить блокировку
Получить статус синхронизации: приобрести
AcquireInterruptily:acquireInterruptily
Получение тайм-аута: tryAcquireNanos
снять блокировку
выпускать
общий
Получить блокировку
приобрестиОбщий
снять блокировку
выпускОбщий
Блокировка потока и пробуждение
Когда поток получает блокировку, другие потоки должны заблокировать ее при повторном получении. Когда поток снимает блокировку, AQS отвечает за пробуждение потока.
Поддержка блокировки
Является ли базовый примитив блокировки потоков используемым для создания блокировок и других классов синхронизации?
Каждый поток, использующий LockSupport, связан с разрешением. Если разрешение доступно и может быть использовано в процессе, вызов park() приведет к немедленному возврату, в противном случае он может заблокироваться. Если лицензия еще не доступна, вы можете вызвать unpark, чтобы сделать ее доступной.
припарковаться(), отпарковаться()
КАС
«Сравни и обменяй», основная и самая базовая теория всей системы JUC.
Значение памяти V, старое ожидаемое значение A и значение, подлежащее обновлению B. Если и только если значение значения памяти V равно старому ожидаемому значению A, значение значения памяти V будет изменено на B, в противном случае ничего не произойдет. быть сделано.
В нативном коде есть четыре параметра.
дефект
Время цикла слишком велико
Только одна общая переменная может быть гарантированно управляема атомарно.
проблема ABA
решение
номер версии
AtomicStampedReference
Замок
Реентерантлокок
Реентерабельная блокировка — это рекурсивный неблокирующий механизм синхронизации.
Более мощный и гибкий механизм блокировки, чем синхронизированный, что позволяет снизить вероятность тупиковой ситуации.
Разделяется на справедливую блокировку и несправедливую блокировку.
Нижний уровень реализован с использованием AQS и наследует AQS посредством внутренней синхронизации.
Повторный входЧтениеЗаписьБлокировка
Блокировка чтения-записи, две блокировки: общая блокировка: блокировка чтения, монопольная блокировка: блокировка записи.
Поддерживает справедливость, несправедливость, повторный вход и ухудшение блокировки.
Понижение уровня блокировки: в соответствии с порядком получения блокировки записи, получения блокировки чтения и снятия блокировки записи, блокировка записи может быть понижена до блокировки чтения.
Состояние
Lock предоставляет условие, которое является более подробным и гибким для операций ожидания и пробуждения потока.
Очередь условий поддерживается внутри компании. Когда текущий поток вызывает метод await(), из текущего потока будет создан узел (Node), и этот узел будет добавлен в конец очереди.
Инструменты параллелизма
ЦиклическийБарьер
Это позволяет группе потоков ждать друг друга, пока не будет достигнута общая точка барьера.
С точки зрения непрофессионала: пусть группа потоков будет заблокирована, когда они достигнут барьера. Барьер не откроется, пока последний поток не достигнет барьера, и все потоки, перехваченные барьером, продолжат работать.
Нижний уровень реализован с использованием условия ReentrantLock.
Сценарии применения
Операция объединения многопоточных результатов используется для вычисления данных в нескольких потоках и окончательного объединения результатов вычислений.
Обратный отсчетЗащелка
Это позволяет одному или нескольким потокам ожидать завершения набора операций, выполняемых в других потоках.
Инициализирует CountDownLatch заданным счетчиком. Поскольку вызывается метод countDown(), метод await блокируется до тех пор, пока текущий счетчик не достигнет нуля. После этого все ожидающие потоки освобождаются, и все последующие вызовы await возвращаются немедленно. Такое поведение происходит только один раз — счетчик не может быть сброшен. Если вам нужно сбросить счетчик, рассмотрите возможность использования CyclicBarrier.
Отличие от CyclicBarrier
Функция CountDownLatch позволяет 1 или N потокам ожидать завершения выполнения других потоков, а CyclicBarrier позволяет N потокам ждать друг друга;
Счетчик CountDownLatch не может быть сброшен; счетчик CyclicBarrier можно сбросить и использовать, поэтому он называется циклическим барьером.
Внутренне реализовано с использованием общих блокировок.
Семафор
сигнал
Счетчик, контролирующий доступ к нескольким общим ресурсам.
Концептуально семафор поддерживает набор разрешений. При необходимости каждый методacquire() блокируется до тех пор, пока разрешение не станет доступным, а затем получает разрешение. Каждый Release() добавляет разрешение, потенциально освобождая блокирующий метод получения. Однако вместо использования фактического объекта лицензии Semaphore просто подсчитывает количество доступных лицензий и предпринимает соответствующие действия.
Семафор Семафор — это неотрицательное целое число (>=1). Когда поток хочет получить доступ к общему ресурсу, он должен сначала получить семафор. Когда семафор > 0, получить ресурс и установить семафор - 1. Если значение семафора = 0, это означает, что все общие ресурсы заняты другими потоками, и поток должен дождаться, пока другие потоки освободят ресурсы. Когда поток освобождает ресурс, семафор равен 1.
Сценарии применения
Часто используется для ограничения количества потоков, которые могут получить доступ к определенным ресурсам (физическим или логическим).
Внутренне реализовано с использованием общих блокировок.
Обменник
Точка синхронизации для потоков, которые могут объединять в пары и менять местами элементы в паре.
Позволяет обмениваться данными между параллельными задачами. В частности, класс Exchanger позволяет определять точки синхронизации между двумя потоками. Когда оба потока достигают точки синхронизации, они обмениваются структурами данных, поэтому структура данных первого потока переходит во второй поток, а структура данных второго потока переходит в первый поток.
другой
ThreadLocal
Решение проблемы переменных-членов в многопоточной среде, но не имеет ничего общего с синхронизацией потоков. Идея состоит в том, чтобы создать отдельную копию переменной для каждого потока, чтобы каждый поток мог независимо изменять свою копию переменной, не затрагивая соответствующие копии других потоков.
ThreadLocal не используется для решения проблемы общих переменных и не существует для координации синхронизации потоков, но представляет собой механизм, созданный для того, чтобы каждый поток мог обрабатывать свое собственное состояние.
четыре метода
get(): возвращает значение в копии текущего потока этой локальной переменной потока.
InitialValue(): возвращает «начальное значение» текущего потока для локальной переменной этого потока.
Remove(): удалить значение локальной переменной этого потока в текущем потоке.
set(T value): устанавливает значение в копии текущего потока этой локальной переменной потока в указанное значение.
ThreadLocalMap
Ключ к реализации механизма изоляции потоков
Каждый поток имеет внутри переменную-член типа ThreadLocal.ThreadLocalMap, которая используется для хранения копии фактической переменной ThreadLocal.
Предоставляет метод для хранения копии переменных каждого потока с использованием пар ключ-значение. Ключ — это текущий объект ThreadLocal, а значение — копия переменной соответствующего потока.
будь осторожен
Экземпляр ThreadLocal сам по себе не хранит значение, он просто предоставляет ключ для поиска копии значения в текущем потоке.
Это ThreadLocal, содержащийся в Thread, а не Thread, содержащийся в ThreadLocal.
проблема с утечкой памяти
ThreadLocalMap
ключ — слабая ссылка, значение — сильная ссылка и не может быть переработано
Явно вызовите метод удаления()
Разветвление/Присоединение
Фреймворк для параллельного выполнения задач — это фреймворк, который делит большие задачи на несколько маленьких и, наконец, объединяет результаты каждой маленькой задачи для получения результатов большой задачи.
Основная идея
«Перегородка»
fork разбивает задачи, а join собирает данные
воровство работы
Поток крадет задачи из других очередей для выполнения
Поток, выполняющий блок, помогает медленному потоку выполнить задачу и повышает эффективность всей задачи.
Очередь должна использовать двустороннюю очередь.
основной класс
ФоркДжоинПул
Пул потоков для выполнения задач
ForkJoinTask
Представляет задачи, абстракцию задач для ForkJoinPool.
ForkJoinWorkerThread
Рабочий поток, выполняющий задачи
Параллельные коллекции Java
ConcurrentHashMap
CAS Synchronized обеспечивает безопасность одновременных обновлений. Нижний уровень использует структуру хранения связанного списка/красно-черного дерева.
Важные внутренние классы
Узел
пара ключ-значение
Древовидный узел
Красно-черный узел дерева
ДеревоБин
Это эквивалентно красно-черному дереву. Метод его построения на самом деле представляет собой процесс построения красно-черного дерева.
Узел пересылки
Вспомогательный узел, используемый для операции расширения ConcurrentHashMap.
размерCtl
Идентификатор управления, используемый для управления операциями инициализации и расширения таблицы.
значение
Отрицательное число указывает на то, что выполняются операции инициализации или расширения.
-1 означает инициализацию
-N указывает, что существует N-1 потоков, выполняющих операции расширения.
Положительное число или 0 указывает, что хэш-таблица не была инициализирована. Это значение указывает размер инициализации или следующего расширения.
Важные операции
initTable
Метод инициализации ConcurrentHashMap
В процессе инициализации может участвовать только один поток, остальные потоки должны приостановиться.
Конструктор не выполняет процесс инициализации. Инициализация фактически запускается операцией put.
шаг
sizeCtl < 0 означает, что инициализация выполняется и поток приостановлен
Поток получает квалификацию инициализации (CAS(SIZECTL, sc, -1)) для выполнения процесса инициализации.
После завершения шага инициализации установите sizeCtl = 0,75 * n (порог следующего расширения), указывающий размер следующего расширения.
помещать
Основная идея
Вычислите позицию узла, вставленного в таблицу, на основе значения хеш-функции. Если позиция пуста, вставьте ее напрямую, в противном случае вставьте ее в связанный список или дерево.
Реальная ситуация сложнее
шаг
Таблица имеет значение null, и поток переходит на этап инициализации. Если инициализируются другие потоки, поток зависает.
Если текущая вставленная позиция i равна нулю, это означает, что эта позиция вставляется впервые. Просто используйте CAS для вставки узла. Если вставка прошла успешно, вызывается addCount, чтобы определить, необходимо ли расширение. Если вставка не удалась, продолжайте сопоставление (вращение)
Если хэш узла == MOVED (-1), это означает, что поток расширяется, и он вступит в процесс расширения.
В других случаях узлы вставляются согласно связному списку или красно-черной древовидной структуре, но этот процесс требует блокировки (синхронизации).
получать
шаг
таблица == ноль вернуть ноль;
Получить из связанного списка/узла красно-черного дерева
Расширение
Многопоточное расширение
шаг
Создайте таблицу nextTable, размер которой в два раза превышает исходный размер. Этот шаг выполняется в однопоточной среде.
Скопируйте содержимое исходной таблицы в nextTable. Этот шаг позволяет выполнять многопоточные операции.
Процесс преобразования связанного списка в красно-черное дерево
Количество элементов в связанном списке достигает порога 8, затем связанный список преобразуется в красно-черное дерево.
Алгоритм красно-черного дерева
Разница между 1,8 и 1,7
ConcurrentLinkedQueue
Неограниченная потокобезопасная очередь, основанная на узлах связи, использующая принцип FIFO для сортировки элементов и внутренне реализованная с использованием алгоритма CAS.
неизменность
Следующий из последнего элемента в очереди имеет значение null
Элементы всех восстановленных узлов в очереди не могут быть нулевыми и могут быть пройдены из головного узла.
Чтобы узел был удален, вместо того, чтобы напрямую устанавливать для него значение null, сначала установите для его поля элемента значение null (итератор будет пропускать узлы с нулевым элементом).
Разрешить задержку обновлений головы и хвоста. Что это значит? Это означает, что заголовок и хвост не всегда указывают на первый и последний элемент (объясняется позже).
Инвариантность и изменчивость головы
Инвариантность и изменчивость хвоста
Тонкость: CAS используется для выполнения операций с данными, допуская при этом несогласованность в очереди, при этом полностью демонстрируется слабая согласованность.
ConcurrentSkipListMap
Третья структура данных «ключ-значение»: SkipList (список пропуска)
Пропустить список
Сбалансированная двоичная древовидная структура
Список пропуска позволяет распределять отсортированные данные в многоуровневом связанном списке, используя случайное число 0–1, чтобы определить, будут ли данные подниматься вверх или нет, используя алгоритм «обмена пространства на время». К каждому узлу добавляется указатель вперед, а некоторые узлы, которые невозможно задействовать, можно игнорировать при вставке, удалении и поиске, тем самым повышая эффективность.
характеристика
Он состоит из множества слоев структуры, и уровни генерируются случайным образом с определенной вероятностью.
Каждый уровень представляет собой упорядоченный связанный список. По умолчанию используется возрастающий порядок. Его также можно отсортировать в соответствии с компаратором, указанным при создании сопоставления, в зависимости от используемого конструктора.
Связанный список самого нижнего уровня (Уровень 1) содержит все элементы.
Если элемент появляется в связанном списке уровня i, он также появится в связанных списках ниже уровня i.
Каждый узел содержит два указателя: один указывает на следующий элемент в том же связанном списке, а другой — на элемент, расположенный на один уровень ниже.
Найти, удалить, добавить
Конкурентскиплистсет
Внутренне реализовано с использованием ConcurrentSkipListMap.
атомный
класс базового типа
Используется для атомарного обновления базовых типов.
АтомныйBoolean
Атомное обновление логического типа
Атомное целое число
Целое число атомарного обновления
AtomicLong
Атомное обновление длинное
множество
Обновить элемент массива атомарно
АтомныйЦелыйМассив
Атомарное обновление элементов целочисленного массива
AtomicLongArray
Атомное обновление элементов в массиве длинных целых чисел
Атомная ссылкаМассив
Атомарное обновление элементов в массиве ссылочного типа
ссылочный тип
Если вы хотите обновить несколько переменных атомарно, вам нужно использовать класс, предоставляемый этим ссылочным типом атомарного обновления.
Атомная ссылка
Атомарное обновление ссылочных типов
AtomicReferenceFieldUpdater
Атомарное обновление полей в ссылочных типах
Атомная маркируемая ссылка
Атомарное обновление ссылочных типов с битами флагов
Класс поля
Если нам нужно только определенное поле в определенном классе, нам нужно использовать атомарное обновление класса поля.
AtomicIntegerFieldUpdater
Средство обновления для атомарного обновления целочисленных полей.
AtomicLongFieldUpdater
Средство обновления для атомарного обновления длинных полей
AtomicStampedReference
Атомарное обновление ссылочного типа с номером версии
блокирующая очередь
МассивБлокированиеОчередь
Блокирующая очередь, ограниченная FIFO, реализованная в виде массива.
ArrayBlockingQueue ограничен и фиксирован. Размер подтверждается в конструкторе. После подтверждения изменения не поддерживаются.
«Справедливость» не гарантируется в многопоточной среде.
выполнить
Реентерантлокок
Состояние
LinkedBlockingQueue
Неограниченная блокирующая очередь FIFO на основе ссылок
ПриоритетБлокировкаОчередь
Неограниченная очередь блокировки с приоритетной поддержкой
По умолчанию элементы сортируются по возрастанию в естественном порядке. Вы можете сортировать элементы, указав Comparator.
двоичная куча
Классификация
максимальная куча
Значение ключа родительского узла всегда больше или равно значению ключа любого дочернего узла.
мин куча
Значение ключа родительского узла всегда меньше или равно значению ключа любого дочернего узла.
Операция добавления постоянно «поднимается вверх», а операция удаления постоянно «падает вниз».
выполнить
Условие повторной блокировки
двоичная куча
DelayQueue
Неограниченная очередь блокировки, поддерживающая отложенное получение элементов.
приложение
Кэш: очистите кэшированные данные, срок действия которых истек в кеше.
Обработка тайм-аута задачи
выполнить
Условие повторной блокировки
Приоритетная очередь, отсортированная по времени задержки: PriorityQueue
Задержанный интерфейс
Используется для обозначения объектов, которые должны быть выполнены после заданного времени задержки.
Этот интерфейс требует, чтобы реализующие его классы определяли метод CompareTo, который обеспечивает порядок, соответствующий методу getDelay этого интерфейса.
Синхронная очередь
Блокирующая очередь без емкости
приложение
Для обмена работой поток производителя и поток потребителя синхронизируются для доставки определенной информации, событий или задач.
Трудно понять, есть трудности с обменником
LinkedTransferQueue
Неограниченная очередь блокировки, состоящая из связанного списка
Эквивалент расширенного набора ConcurrentLinkedQueue, SynchronousQueue (в честном режиме), неограниченных LinkedBlockingQueues и т. д.
упреждающий режим
Если он доступен, возьмите его напрямую. Если нет, он будет занимать эту позицию до тех пор, пока не будет получен, или не истечет время, или будет прервано.
LinkedBlockingDeque
Двусторонняя блокирующая очередь, состоящая из связанного списка.
Емкость не является обязательной. Емкость можно установить во время инициализации, чтобы предотвратить чрезмерное расширение. Если она не установлена, емкость по умолчанию — Integer.MAX_VALUE.
использовать
Модель «кража работы»
Пул потоков
выгода
Уменьшите потребление ресурсов
Сократите затраты на создание и уничтожение потоков за счет повторного использования созданных потоков.
Улучшите скорость ответа
При поступлении задачи ее можно выполнить немедленно, не дожидаясь создания потока.
Улучшение управления потоками
Унифицированное распределение, настройка и мониторинг
Исполнитель
Исполнители
Статический фабричный класс предоставляет статические фабричные методы Executor, ExecutorService, ScheduledExecutorService, ThreadFactory, Callable и других классов.
ThreadPoolExecutor
Значение параметра
corePoolSize
Количество основных потоков в пуле потоков
Максимальный размер пула
Максимальное количество потоков, разрешенное в пуле потоков
KeepAliveTime
Время простоя потока
единица
единица KeepAliveTime
работаОчередь
Блокирующая очередь, используемая для хранения задач, ожидающих выполнения.
используется блокирующая очередь
МассивБлокированиеОчередь
LinkedBlockingQueue
Синхронная очередь
ПриоритетБлокировкаОчередь
ThreadFactory
Фабрика, используемая для настройки создания потоков
ДефолтТреадФабрика
обработчик
RejectedExecutionHandler, стратегия отклонения пула потоков
Классификация
AbortPolicy: напрямую создавать исключение, политика по умолчанию.
CallerRunsPolicy: используйте поток, в котором находится вызывающая сторона, для выполнения задач.
DiscardOldestPolicy: отменить самую переднюю задачу в очереди блокировки и выполнить текущую задачу.
DiscardPolicy: отменить задачу напрямую.
Классификация пула потоков
новыйFixedThreadPool
Многоразовый пул потоков с фиксированным количеством потоков.
анализировать
corePoolSize соответствует максимальномуPoolSize
Использование «неограниченной» очереди LinkedBlockingQueue
максимальныйPoolSize, KeepAliveTime, Отклоненный обработчик выполнения неверный
новыйCachedThreadPool
Исполнитель, использующий один рабочий поток
анализировать
corePoolSize и MaximumPoolSize установлены в 1.
Используйте LinkedBlockingQueue в качестве рабочей очереди.
новыйSingleThreadExecutor
Пул потоков, который создает новые потоки по мере необходимости.
анализировать
Для corePoolSize установлено значение 0.
для параметра MaximumPoolSize установлено значение Integer.MAX_VALUE.
SynchronousQueue как WorkerQueue
Если основной поток отправляет задачи быстрее, чем потоки в задачах процесса MaximumPool, CachedThreadPool продолжит создавать новые потоки, что может истощить ресурсы ЦП и памяти.
Отправка задачи
Исполнитель.execute()
ИсполнительService.submit()
Выполнение задачи
Процесс реализации
Настройка пула потоков
Две модели
Мониторинг пула потоков
ScheduledThreadPoolExecutor
Унаследовано от ThreadPoolExecutor
Запускайте задачу после заданной задержки или периодически выполняйте задачу.
Для его реализации используется DelayQueue, а запланированные задачи помещаются в DelayQueue. DelayQueue внутренне инкапсулирует PriorityQueue, который сортирует ScheduledFutureTasks в очереди.
Будущее
Асинхронный расчет
Будущее
Обеспечить операции
Отмена выполнения задач
Запросить, выполнена ли задача
Получить результаты выполнения задачи
Будущаязадача
Реализуйте интерфейс RunnableFuture, который можно выполнить как Runnable или использовать как Future для получения возвращаемого значения Callable.
Внутренне реализовано на основе AQS