Explicación del parámetro de clase Java ThreadPoolExecutor

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

ThreadPoolExecutorEsta clase es un grupo de subprocesos, consulte "Tecnología central de Java, volumen 1", este libro antes, se puede introducir Executorspara crear un grupo de subprocesos métodos estáticos de clase, como Executors.newCachedThreadPool()método, de hecho, esencialmente también se llama ThreadPoolExecutoral 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 la Executorsclase para crear un grupo de subprocesos, como se muestra en la FIG.

Inserte la descripción de la imagen aquí

Por eso es muy necesario aprender sobre el ThreadPoolExecutoruso de la clase.

Parámetros de constructor

ThreadPoolExecutorLa 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, maximumPoolSizey workQueuetres 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 longitud

Primero asumido corePoolSize, maximumPoolSizey workQueuela longitud es un número entero mayor que 0. En una nueva tarea taskllega, en cuatro casos, como se muestra a continuación.

Inserte la descripción de la imagen aquí

  1. 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.
  2. Cuando el número de subprocesos en el grupo de subprocesos> = corePoolSizey la cola de bloqueo workQueueno está llena, la nueva tarea se colocará en la cola de bloqueo para esperar.
  3. Cuando el número de subprocesos en el grupo de subprocesos> = corePoolSizey el número de subprocesos del grupo de subprocesos < maximumPoolSizemientras la cola de bloqueo workQueueestá llena, se crea un nuevo subproceso no central y para llevar a cabo la tarea que se le ha confiado.
  4. Cuando el número de subprocesos del grupo de subprocesos = maximumPoolSize, mientras que la cola de bloqueo workQueueestá llena, la tarea será rechazada, más adelante se introducirán tratamientos específicos rechazados.

Nota : Cuando la cola de bloqueo se establece workQueuecuando la cola es infinita (por ejemplo, no hay un volumen predefinido LinkedBlockingQueue), maximumPoolSizeserá inútil. Porque cuando finaliza corePoolSize, 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 vivo

Si 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 del corePoolSizetiempo, esta estrategia se implementará, pero se allowCoreThreadTimeOut(boolean)puede configurar para que el método de política también aplique el subproceso principal.

handler : Rechaza el procesador de tareas

Cuando el grupo de subprocesos está cerrado o la capacidad del grupo de subprocesos está llena ( workQueuellena y el número de maximumPoolSizesubprocesos 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.

  1. ThreadPoolExecutor.AbortPolicy: Procesador rechazado predeterminado, se negó a lanzar cuando una RejectedExecutionExceptionexcepción de tarea .
  2. 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.
  3. ThreadPoolExecutor.DiscardPolicy : Descarta directamente las tareas que no se pueden ejecutar.
  4. ThreadPoolExecutor.DiscardOldestPolicy: Si el grupo de subprocesos no está cerrado, el bloqueo del grupo de subprocesos de la cola descarta workQueuela 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() con setCorePoolSize(int corePoolSize)

    Como puede ver en el nombre, puede ver y modificar el número de subprocesos principales en el grupo de subprocesos.

  • getMaximumPoolSize() con setMaximumPoolSize(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 Executorsmétodo estático mencionado anteriormente para crear un grupo de subprocesos por su propia naturaleza también es una llamada al ThreadPoolExecutorconstructor, 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

Supongo que te gusta

Origin blog.csdn.net/qq_41512783/article/details/109473365
Recomendado
Clasificación