Исполнители: Почему Али не любит меня видеть?

интервью Java

Привет всем, яExcutors, честный класс инструмента.

В статье есть программист по имени Лаосан.Если бы кто-то говорил о таких пулах потоков раньше, я бы понял!Он выкопал яму и сказал, что хочет познакомить меня со всеми.

Я на самом деле очень огорчен.Как инструмент без эмоций и честной работы, я был занесен в черный список Alibaba. Они написали в буклете под названием «Руководство по разработке Java»:

禁止使用Excutors

Авторский голос за кадром: Почему вас блокируют, если вы невнятно пишете, вас не в чем упрекнуть. И вы парень, который выглядит честным на поверхности, это вы делаете работу? Не все младшие братья работают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()Схема работы:

FixedThreadPool

Общий процесс работы:

  • В настоящее время запущено меньше потоков, чем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Текущий процесс:

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Текущий процесс:

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Процесс выполнения задачи:

ScheduledThreadPool执行流程

В основном он делится на две части:

  1. перечислитьscheduleAtFixedRate()/scheduleWithFixedDelay()метод, будетDelayQueueдобавить одинScheduledFutureTask.
  2. Потоки пула потоков изDelayQueueполучено вScheduledFutureTask, а затем выполните задание.

Он также может создавать потоки бесконечно, поэтому такжеOOMриски.

Чтобы добиться периодического выполнения задач,ScheduledThreadPoolExecutorправильноThreadPoolExecutorС некоторыми изменениями [4]:

  • ScheduledFutureTaskкак выполнение задачи планирования

    В основном он содержит 3 переменные-членыtime(任务将要被执行的具体时间),sequenceNumber(任务的序号),period(任务执行的间隔周期)

  • использоватьDelayQueueкак очередь задач

    DelayQueueупаковалPriorityQueue, ответит на пару в очередиScheduledFutureTaskДля сортировки приоритет сортировки: время>порядковый номер.

ScheduledThreadPoolExecutor执行流程

ScheduledThreadPoolExecutorВыполнение задачи в основном делится на 4 этапа:

  1. в пуле потоков线程1отDelayQueueпросроченныйScheduledFutureTask(DelayQueue.take())
  2. 线程1выполнить этоScheduledFutureTask
  3. 线程1ИсправлятьScheduledFutureTaskизtimeПеременная — это время, которое будет выполнено в следующий раз.
  4. 线程1изменить этоtimeПослеScheduledFutureTaskположить обратноDelayQueueСредний (DelayQueue.add())

Excutors readme: Это, это... Проблема с классом инструмента не называется ошибкой. Хотя я ленивый и не работаю, может я и ООМ, но я все равно хороший инструмент, уууу...

Автор: Да что не так с Excutors? Это просто бесчувственный инструмент, и виноваты только люди, которые используют его не по назначению. Итак, знайте, что это такое и почему это так, поймите принцип и гибко его применяйте. Мы должны быть похожи на солдата, который не только нажимает на курок, но и разбирает и обслуживает огнестрельное оружие.

Я трехконечное зло, full-stack разработчик, который утверждает, что способен и писать, и заниматься боевыми искусствами.

подобно,обрати внимание наНе теряйтесь, увидимся в следующий раз!



Ссылаться на:

[1] «Искусство параллельного программирования на Java».

[2]. По правде говоря, на этот раз вы точно сможете легко изучить пулы потоков.

[3] Брат Сяо Фу "Руководство по Java Face Sutra"

[4] «Красота параллельного программирования на Java».

[5].Alibaba "Руководство по разработке Java"