Введение:
Пакет параллельного программирования JUC был добавлен в версию Jdk1.5, что значительно упрощает традиционную многопоточную разработку.Как Java-разработчик, очень важно понимать использование пулов потоков для управления потоками в параллельных сценариях;
концепция:
Пул потоков Java является продуктом типичной идеи объединения, подобно пулу соединений с базой данных, пулу соединений Redis и т. д. Идея объединения заключается в том, чтобы подать заявку на ресурсы в начале, создать пакет используемых соединений, поставить задачи в очередь во время обработки, а затем запустить эти задачи после создания потоков.Если количество потоков превышает максимальное количество Потоки ждут в очереди, ждут завершения выполнения других потоков, а затем берут задачи из очереди для выполнения;
Условие отклонения пула потоков:
В пуле потоков JAVA есть три важных параметра, которые определяют, используется ли стратегия отклонения:
1.corePoolSize — количество потоков ядра, то есть минимальное количество потоков.
2.workQueue - конкретная очередь блокировки.
3.maximumPoolSize - максимальное количество потоков
Когда количество отправленных задач больше, чем corePoolSize, задачи будут преимущественно помещены в очередь блокировки workQueue. Когда очередь блокировки переполняется, количество потоков в пуле потоков будет увеличиваться до тех пор, пока не будет достигнуто максимальное количество потоков в конфигурации MaximumPoolSize. На этом этапе любые избыточные задачи активируют политику отклонения пула потоков.
Конкретные типы и определения пулов потоков:
Стратегия отклонения предоставляет интерфейс верхнего уровня RejectedExecutionHandler , где метод rejectExecution предназначен для настройки логики выполнения конкретной стратегии отклонения.
Jdk по умолчанию предоставляет четыре политики отказа:
1.CallerRunsPolicy — когда срабатывает политика отклонения, пока пул потоков не закрыт, вызывающий поток используется для непосредственного запуска задачи. Как правило, параллелизм относительно невелик, требования к производительности невысоки, а сбой не допускается. Однако, поскольку вызывающая сторона запускает задачу сама по себе, если скорость отправки задачи слишком высока, это может привести к блокировке программы, и производительность неизбежно понесет большие потери.
2.AbortPolicy — прервать задачу и выдать информацию об исключении RejectedExecutionException. Политика отказа по умолчанию для пулов потоков. Мы должны обработать выброшенное исключение в вызывающем потоке, иначе текущий поток выполнения будет прерван, что повлияет на последующее выполнение задачи.
3.DiscardPolicy - Отменить напрямую без выполнения других операций
4. DiscardOldestPolicy — когда срабатывает политика отклонения, пока пул потоков не закрыт, самая старая задача в блокирующей очереди workQueue отбрасывается и добавляется новая задача.
Переопределение политики отклонения:
В реальной разработке возможно, что эти четыре стратегии отклонения, обычно используемые пулами потоков, не могут удовлетворить потребности наших бизнес-сценариев.В настоящее время стратегию отклонения необходимо переписать;
For Example:
1. Интерфейсная реализация стратегии отбраковки
public interface RejectedExecutionHandler {
void rejectedExecution(Runnable r,
ThreadPoolExecutor executor);
}
2. Перепишите пример:
Нам нужно только передать нашу пользовательскую политику отклонения для пула потоков, когда пул потоков создается, чтобы изменить исходную политику отклонения;
Реализация демо выглядит следующим образом:
package com.hinson.study;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
public class RejectedDemo implements RejectedExecutionHandler{
public RejectedDemo(){ }
@Override
public void rejectedExecution(Runnable runnable , ThreadPoolExecutor executor) { System.out.println("线程池自定义处理..");
System.out.println("当前被拒绝任务为:" + runnable.toString());
}
}