English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Простое введение в использование ThreadPoolExecutor в java

java ThreadPoolExecutor

Введение:

В проекте, если используется функция отправки SMS, обычно эту операцию делают асинхронной, так как в большинстве случаев, успех или неудача отправки SMS не влияет на основную процедуру. Конечно, операции, такие как отправка сообщений в MQ, также можно обернуть в асинхронные операции.

Использование базового New Thread

Если нужно, чтобы операция была асинхронной, можно создать новый поток и реализовать бизнес-операцию в методе run. Например:

 new Thread(new Runnable() {
    public void run() {
      // отправка SMS, отправка сообщений в MQ и т.д.
    }
 });

Но у этого способа есть несколько недостатков.

1. Каждый раз создается новый поток, после выполнения он разрушается и не может быть повторно использован;

2. Если объем параллелизма системы очень большой и требует большого количества потоков, то这种方式 с每次 созданием new будет конкурировать за ресурсы.

ThreadPoolExecutor

Мы можем использовать ThreadPoolExecutor из jdk1.5 для обертки асинхронных операций. Преимуществом ThreadPoolExecutor является возможность повторного использования потоков, а также использование минимального количества потоков для выполнения большего количества задач, что обеспечивает высокую эффективность и производительность. Пример кода см. ниже:

public class ThreadPool {
  private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(8, 12, 30,
      TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(50000), new ThreadPoolExecutor.AbortPolicy());
  public static ThreadPoolExecutor getThreadPool() {
    return threadPool;
  }
}

参数介绍

public ThreadPoolExecutor(int corePoolSize,
               int maximumPoolSize,
               long keepAliveTime,
               TimeUnit unit,
               BlockingQueue<Runnable> workQueue,
               RejectedExecutionHandler handler) {
 }

corePoolSize: когда элементы в очереди workQueue еще не достигли максимума, corePoolSize представляет максимальное количество потоков в пуле;
maximumPoolSize: максимальное количество потоков, которое позволяет线程овый пул;
keepAliveTime: если количество потоков в пуле превышает corePoolSize, то те потоки, которые долго простаивают, должны быть уничтожены. keepAliveTime - это максимальное время простоя этих потоков;
unit: единица времени keepAliveTime;
workQueue: когда количество потоков в пуле достигло corePoolSize, если запросы продолжают поступать, задачи, соответствующие запросам, будут помещены в очередь;
handler: когда workQueue заполнена, и количество потоков в пуле достигло maximumPoolSize, в этот момент уже нет дополнительных ресурсов для обработки запросов, необходимо использовать RejectedExecutionHandler для обработки. Отказ в обработке или выброс задачи и т.д.

Процесс выполнения

Когда нет запросов, в池е нет ни одного потока;

Когда есть запросы, создаются потоки, пока количество потоков в пуле не будет равно corePoolSize;

Если запросы слишком много, и нужно больше потоков для обработки, ThreadPoolExecutor выберет放置 запросов в очередь, не создавая новые потоки;

Если workQueue также заполнена, ThreadPoolExecutor продолжит создавать потоки, пока количество потоков не будет равно maximumPoolSize;

Когда количество потоков достигает maximumPoolSize, и workQueue также медленно, запросы можно отправлять на обработку RejectedExecutionHandler.

Заметка

При использовании ThreadPoolExecutor необходимо выбирать параметры значения的大小 в зависимости от вашей бизнес-ситуации.

Спасибо за чтение, надеюсь, это поможет вам, спасибо за поддержку нашего сайта!

Вам может понравиться