Метод строительства
Нечего сказать, самым основным является метод строительства.
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
семь параметров
Проще говоря, это фактически параметр конфигурации.
-
corePoolSize
: размер количества основных потоков: простаивают они или нет после создания. Пул потоков должен поддерживатьcorePoolSize
количество потоков, если не установленоallowCoreThreadTimeOut
. -
maximumPoolSize
: максимальное количество потоков: максимальное количество потоков, которое можно создать в пуле потоков.maximumPoolSize
нить. -
keepAliveTime
:время выживания:если прошлоkeepAliveTime
По истечении времени, если потоки, превышающие количество основных потоков, не получили новых задач, они будут перезапущены. -
unit
:keepAliveTime
единица времени. -
workQueue
: Очередь для хранения задач для выполнения: когда количество отправленных задач превышает количество основных потоков, отправленные задачи сохраняются здесь. Используется только для храненияexecute
метод представленRunnable
Задача. Так что не переводите тут в очередь работ, не копайте себе яму. -
threadFactory
:Thread Engineering: используется для создания фабрики потоков. Например, здесь вы можете настроить имя потока.При анализе стека виртуальной машины вы можете узнать, откуда берется поток, посмотрев на имя, и вы не будете сбиты с толку. -
handler
: Политика отклонения: Когда очередь заполнена задачами и работают потоки с максимальным количеством потоков, пул потоков задач, которые продолжают отправляться, не может быть обработан.Какая политика отказа должна быть реализована.
Процесс выполнения JDK
Пул потоков используется для обработки задач.Когда приходит задача, основной процесс выполнения пула потоков выглядит следующим образом
- Если количество основных потоков в пуле потоков JDK заполнено, последующие запросы будут помещены в очередь блокировки, а максимальное количество потоков будет включено только при заполнении очереди блокировки.
Процесс выполнения Tomcat
Если вы используете Tomcat, то...
- Текущий процесс пула потоков в Tomcat: если количество основных потоков израсходовано, то используется максимальное количество потоков, и, наконец, задача отправляется в очередь. Это делается для того, чтобы время отклика было приоритетным.
300 — это только максимальное значение.Если запросы будут продолжать поступать, это определенно будет слишком много.
проблема
10 машин, 1000 одновременных запросов, каждый сервис берет на себя в среднем 100 запросов. Сервер имеет 4-х ядерную конфигурацию.
- если
CPU
Для интенсивных задач мы должны свести к минимуму переключение контекста, поэтому количество основных потоков может быть установлено на5
, длину очереди можно задать как100
, максимальное количество потоков остается таким же, как и количество основных потоков. - если
IO
Для интенсивных задач мы можем соответствующим образом выделить немного больше основных потоков, чтобы лучше использовать ресурсы.CPU
, поэтому количество основных потоков может быть установлено равным8
, длина очереди по-прежнему100
, максимальный пул потоков устанавливается равным10
.
Конечно, все вышеперечисленное является теоретическими значениями. Наиболее подходящие настройки следует определять путем сравнения результатов испытаний под давлением.
Рассмотрим с 4 точек зрения:
-
CPU密集型
Случай. -
IO密集型
Случай. - Разумно благодаря измерению давления
参数配置
. - Пул потоков
动态调整
. (Благодаря мониторингу пула потоков можно получить раннее предупреждение)
Стратегия настройки
Как правило, во-первых, база данных не выдерживает нагрузки.
- Оптимизация параметров системы.
- Распределите давление. Подтаблица подбиблиотеки, разделение чтения и записи
- Внедрить кэширование для перехвата запросов в точке входа.
- Срезайте пики и заполняйте впадины и рационально используйте MQ.
- асинхронный.
- Сервисный предохранитель, понижение сервисного уровня.
- Расширение сервера