Политика отклонения пула потоков и переписывание политики отклонения

задняя часть
Политика отклонения пула потоков и переписывание политики отклонения

Введение:

Пакет параллельного программирования 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());		
	}
}