Привет всем, я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"