Java ThreadPoolExecutor
@autor: Jingdai @ fecha
: 2020.11.03
Recientemente leí el libro "Java Concurrent Programming Practical Combat", que aparece a menudo en el libro
ThreadPoolExecutor
, y no estoy muy familiarizado con esta clase, lo he estudiado y resumido brevemente.
conceptos básicos
ThreadPoolExecutor
Esta clase es un grupo de subprocesos, consulte "Tecnología central de Java, volumen 1", este libro antes, se puede introducirExecutors
para crear un grupo de subprocesos métodos estáticos de clase, comoExecutors.newCachedThreadPool()
método, de hecho, esencialmente también se llamaThreadPoolExecutor
al constructor para crear un grupo de subprocesos Sí, se presentará más adelante. Pero leer el manual de desarrollo de Java de Alibaba no permite el uso de laExecutors
clase para crear un grupo de subprocesos, como se muestra en la FIG.Por eso es muy necesario aprender sobre el
ThreadPoolExecutor
uso de la clase.
Parámetros de constructor
ThreadPoolExecutor
La clase tiene 4 constructores para crear un grupo de subprocesos. Son los siguientes:
- ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue)
- ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, RejectedExecutionHandler handler)
- ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory)
- ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
Ahora parámetros individuales se introducen brevemente introdujo por primera vez
corePoolSize
,maximumPoolSize
yworkQueue
tres parámetros, ya que están relacionadas entre sí.
corePoolSize
: El número de subprocesos principales en el grupo de subprocesos
maximumPoolSize
: El número máximo de subprocesos en el grupo de subprocesos
workQueue
: La cola de bloqueo utilizada por el grupo de subprocesos, aquí se refiere principalmente a su longitudPrimero asumido
corePoolSize
,maximumPoolSize
yworkQueue
la longitud es un número entero mayor que 0. En una nueva tareatask
llega, en cuatro casos, como se muestra a continuación.
- Cuando el número de subprocesos en el grupo de subprocesos <
corePoolSize
, se crea un nuevo subproceso principal y la tarea se le entrega para su ejecución.- Cuando el número de subprocesos en el grupo de subprocesos> =
corePoolSize
y la cola de bloqueoworkQueue
no está llena, la nueva tarea se colocará en la cola de bloqueo para esperar.- Cuando el número de subprocesos en el grupo de subprocesos> =
corePoolSize
y el número de subprocesos del grupo de subprocesos <maximumPoolSize
mientras la cola de bloqueoworkQueue
está llena, se crea un nuevo subproceso no central y para llevar a cabo la tarea que se le ha confiado.- Cuando el número de subprocesos del grupo de subprocesos =
maximumPoolSize
, mientras que la cola de bloqueoworkQueue
está llena, la tarea será rechazada, más adelante se introducirán tratamientos específicos rechazados.Nota : Cuando la cola de bloqueo se establece
workQueue
cuando la cola es infinita (por ejemplo, no hay un volumen predefinido LinkedBlockingQueue),maximumPoolSize
será inútil. Porque cuando finalizacorePoolSize
, la tarea siempre se agregará a la cola de bloqueo, mientras que la cola de bloqueo no está llena, nunca creará un subproceso que no sea del núcleo.
keepAliveTime
: Hilo mantener vivo el tiempo
unit
: La unidad de tiempo que el hilo permanece vivoSi el número de subprocesos en el grupo de subprocesos excede
corePoolSize
, cuando el tiempo de inactividad del subproceso excede el tiempo establecido por el parámetro anterior, se destruirá. De forma predeterminada, solo cuando la cantidad de subprocesos en el grupo a lo largo delcorePoolSize
tiempo, esta estrategia se implementará, pero seallowCoreThreadTimeOut(boolean)
puede configurar para que el método de política también aplique el subproceso principal.
handler
: Rechaza el procesador de tareasCuando el grupo de subprocesos está cerrado o la capacidad del grupo de subprocesos está llena (
workQueue
llena y el número demaximumPoolSize
subprocesos en el grupo es ), y luego envía una tarea al grupo de subprocesos, provocará el rechazo del trabajo del procesador de tareas. Hay 4 controladores de rechazo predefinidos.
ThreadPoolExecutor.AbortPolicy
: Procesador rechazado predeterminado, se negó a lanzar cuando unaRejectedExecutionException
excepción de tarea .ThreadPoolExecutor.CallerRunsPolicy
: Permite que el hilo que envía la tarea ejecute la tarea enviada por sí mismo. Por ejemplo, si el subproceso principal envía una tarea al grupo de subprocesos y es rechazado por el grupo de subprocesos, el subproceso principal ejecuta la tarea por sí mismo.ThreadPoolExecutor.DiscardPolicy
: Descarta directamente las tareas que no se pueden ejecutar.ThreadPoolExecutor.DiscardOldestPolicy
: Si el grupo de subprocesos no está cerrado, el bloqueo del grupo de subprocesos de la cola descartaworkQueue
la primera tarea y, a continuación, intente realizar de nuevo.
Otros métodos relacionados
Lo anterior describe los parámetros relevantes del constructor. Al mismo tiempo, después de que se crea el grupo de subprocesos, también se pueden cambiar los parámetros relevantes.
getCorePoolSize()
consetCorePoolSize(int corePoolSize)
Como puede ver en el nombre, puede ver y modificar el número de subprocesos principales en el grupo de subprocesos.
getMaximumPoolSize()
consetMaximumPoolSize(int maximumPoolSize)
Ver y modificar el número máximo de subprocesos en el grupo de subprocesos
setKeepAliveTime(long time, TimeUnit unit)
Establecer cuánto tiempo se destruirá el hilo si está inactivo
otro
El
Executors
método estático mencionado anteriormente para crear un grupo de subprocesos por su propia naturaleza también es una llamada alThreadPoolExecutor
constructor, mire el código fuente de jdk8.public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); } public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
Aquí encontrará que la esencia es la misma, por lo que la creación de un grupo de subprocesos a través de este método de construcción puede conocer más claramente los diversos parámetros del grupo de subprocesos.
referencia
- API de Java 8