Привет всем, яExcutors
, честный класс инструмента.
В статье есть программист по имени Лаосан.Если бы кто-то говорил о таких пулах потоков раньше, я бы понял!Он выкопал яму и сказал, что хочет познакомить меня со всеми.
Я на самом деле очень огорчен.Как инструмент без эмоций и честной работы, я был занесен в черный список Alibaba. Они написали в буклете под названием «Руководство по разработке Java»:
Авторский голос за кадром: Почему вас блокируют, если вы невнятно пишете, вас не в чем упрекнуть. И вы парень, который выглядит честным на поверхности, это вы делаете работу? Не все младшие братья работаютThreadPoolExecutor
. Давай, я буду пересчитывать их для тебя одну за другой.
1. newFixedThreadPool
FixedThreadPool
, представляет собой пул потоков фиксированного размера.
Взгляните на его реализацию исходного кода:
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
позвонить напрямуюThreadPoolExecutor
метод построения.
-
核心线程数
а также最大线程数
такой же - использовать
LinkedBlockingQueue
как очередь задач
FixedThreadPool
изexecute()
Схема работы:
Общий процесс работы:
- В настоящее время запущено меньше потоков, чем
corePoolSize
, затем создайте новый поток для выполнения задачи - Текущий запущенный поток больше, чем
corePoolSize
, добавьте задачу вLinkedBlockingQueue
- После того, как поток в пуле потоков завершит задачу, он зациклится на
LinkedBlockingQueue
Получить выполнение задачи в
из-за использования неограниченных очередейLinkedBlockingQueue
для хранения задач, которые не могут быть выполнены, поэтому политика отказа в обслуживании не срабатывает, что может привести кOOM
.
2. newSingleThreadExecutor
SingleThreadExecutor
это пул потоков, который работает с одним потоком.
Исходный код реализации выглядит следующим образом:
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
позвонить напрямуюThreadPoolExecutor
метод построения.
-
核心线程数
а также最大线程数
оба 1 - использовать
LinkedBlockingQueue
как очередь задач
SingleThreadExecutor
Текущий процесс:
- В настоящее время нет запущенных потоков, создайте поток для выполнения задачи
- В настоящее время запущен поток, и задача добавлена
LinkedBlockingQueue
- После того, как поток завершит выполнение задачи, он зациклится на
LinkedBlockingQueue
Получить задачи для выполнения в
Здесь используется неограниченная очередьLinkedBlockingQueue
, что также может привести кOOM
.
3. newCachedThreadPool
CachedThreadPool
это пул потоков, который создает новые потоки по мере необходимости.
Исходный код реализации:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
позвонить напрямуюThreadPoolExecutor
метод построения.
-
核心线程数
0,最大线程数
это очень большое числоInteger.MAX_VALUE
- не использовать емкость
SynchronousQueue
как рабочая очередь -
keepAliveTime
Если установлено значение 60L, поток бездействия будет завершен после бездействия в течение 60 секунд.
CachedThreadPool
Текущий процесс:
- Если в настоящее время есть бездействующие потоки, используйте бездействующие потоки для выполнения задач.
- Если нет незанятых потоков, создайте новый поток для выполнения задачи.
- После того, как вновь созданный поток завершит задачу, он выполнит
poll(keepAliveTime,TimeUnit.NANOSECONDS)
,существуетSynchronousQueue
подожди 60-х
Здесь нет ограничений на размер пула потоков, и потоки могут создаваться бесконечно, что приводит кOOM
.
4. newScheduledThreadPool
ScheduledThreadPool
Это пул потоков с функцией планирования.
Исходный код реализации:
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
Как видите, этот пул потоков не тот, он вызываетScheduledThreadPoolExecutor
метод построения.
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}
- Максимальное количество потоков
Integer.MAX_VALUE
,Неограниченно - использовать
DelayedWorkQueue
как очередь задач
ScheduledThreadPoolExecutor
Процесс выполнения задачи:
В основном он делится на две части:
- перечислить
scheduleAtFixedRate()
/scheduleWithFixedDelay()
метод, будетDelayQueue
добавить одинScheduledFutureTask
. - Потоки пула потоков из
DelayQueue
получено вScheduledFutureTask
, а затем выполните задание.
Он также может создавать потоки бесконечно, поэтому такжеOOM
риски.
Чтобы добиться периодического выполнения задач,ScheduledThreadPoolExecutor
правильноThreadPoolExecutor
С некоторыми изменениями [4]:
-
ScheduledFutureTask
как выполнение задачи планированияВ основном он содержит 3 переменные-члены
time(任务将要被执行的具体时间)
,sequenceNumber(任务的序号)
,period(任务执行的间隔周期)
-
использовать
DelayQueue
как очередь задачDelayQueue
упаковалPriorityQueue
, ответит на пару в очередиScheduledFutureTask
Для сортировки приоритет сортировки: время>порядковый номер.
ScheduledThreadPoolExecutor
Выполнение задачи в основном делится на 4 этапа:
- в пуле потоков
线程1
отDelayQueue
просроченныйScheduledFutureTask
(DelayQueue.take()) -
线程1
выполнить этоScheduledFutureTask
-
线程1
ИсправлятьScheduledFutureTask
изtime
Переменная — это время, которое будет выполнено в следующий раз. -
线程1
изменить этоtime
ПослеScheduledFutureTask
положить обратноDelayQueue
Средний (DelayQueue.add())
Excutors readme: Это, это... Проблема с классом инструмента не называется ошибкой. Хотя я ленивый и не работаю, может я и ООМ, но я все равно хороший инструмент, уууу...
Автор: Да что не так с Excutors? Это просто бесчувственный инструмент, и виноваты только люди, которые используют его не по назначению. Итак, знайте, что это такое и почему это так, поймите принцип и гибко его применяйте. Мы должны быть похожи на солдата, который не только нажимает на курок, но и разбирает и обслуживает огнестрельное оружие.
Я трехконечное зло, full-stack разработчик, который утверждает, что способен и писать, и заниматься боевыми искусствами.
подобно,обрати внимание наНе теряйтесь, увидимся в следующий раз!
Ссылаться на:
[1] «Искусство параллельного программирования на Java».
[2]. По правде говоря, на этот раз вы точно сможете легко изучить пулы потоков.
[3] Брат Сяо Фу "Руководство по Java Face Sutra"
[4] «Красота параллельного программирования на Java».
[5].Alibaba "Руководство по разработке Java"