English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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 необходимо выбирать параметры значения的大小 в зависимости от вашей бизнес-ситуации.
Спасибо за чтение, надеюсь, это поможет вам, спасибо за поддержку нашего сайта!