Desde el uso del principio, para explorar la agrupación de hebras de Java

¿Cuál es el grupo de subprocesos

Cuando necesitamos para procesar una tarea, puede crear un nuevo hilo, permitiendo que el hilo para realizar la tarea. Subproceso del grupo de almacenamiento de la piscina es el significado literal de la rosca, cuando tenemos que hacer frente a una tarea, puede eliminar un hilo desde el grupo de subprocesos para su ejecución.

¿Por qué necesitamos un grupo de subprocesos

En primer lugar, necesitamos saber no hilo de rosca de la piscina crear directamente lo inconvenientes:

  1. La primera es los hilos generales de creación y destrucción, las hebras Java se asignan a la creación y destrucción de hilos muy frecuente pérdida de rendimiento del sistema en las roscas del sistema operativo.

  2. Hilo tomará algo de espacio en la memoria, si creamos un gran número de hilos para realizar tareas al mismo tiempo, puede ocurrir muy bajo situación de memoria.

Con el fin de resolver estos dos problemas se introduce el concepto de la agrupación de hebras, hilo por el complejo para evitar una destrucción creación sobrecarga hilo de repetición provocada, y puede establecer el número máximo de subprocesos que debe evitar la creación de un gran número de roscas de paso a desbordamiento de memoria.

Utilizar el grupo de subprocesos

1. Parámetros básicos de la agrupación de hebras

Quiero dominar el grupo de subprocesos del grupo de subprocesos debe entender primero los parámetros del constructor:

nombre del parámetro tipo significado
corePoolSize En t El número de la base de hilos
maxPoolSize En t El número máximo de hilos
KeepAliveTime largo Mantener el tiempo de supervivencia
WorkQueue BlockingQueue cola de almacenamiento de tareas
threadFactory ThreadFactory Cuando un grupo de subprocesos necesidad de crear un nuevo hilo es creado por ThreadFactory
Manipulador RejectedExecutionHandler Cuando un grupo de subprocesos no puede aceptar la tarea que usted envíe llevado política de denegación

Una a una interpretación de estos parámetros son difíciles de entender, y aquí se combinan un diagrama de flujo para explicar el grupo de subprocesos de procesamiento:

imagen

Cuando nos sometemos a la tarea del grupo de subprocesos, si el número de hilos en el grupo de subprocesos es menor que corePoolSize, se crea directamente un nuevo hilo de procesamiento de tareas;

Si el número de procesos en el grupo de subprocesos ha alcanzado corePoolSize, y almacenar la cola no está llena, la tarea se almacena en la cola de tareas WorkQueue;

Si la cola de almacenamiento estaba lleno, pero el número de hilos aún no ha alcanzado maxPoolSize, esta vez va a seguir para crear un hilo para realizar la tarea. Nota: El número de hilos en la piscina mensaje ha superado este tiempo corePoolSize, más de hilos corePoolSize en el grupo de subprocesos no habrían estado vivo, y cuando se retiraron y se sientan sobre KeepAliveTime después de la hora establecida, será destruido.

Si el número de hilos de haber alcanzado maxPoolSize, esta vez si la tarea de nuevo, el grupo de subprocesos para tomar Handler política de denegación niega la tarea especificada.

2. El análisis de varios piscina hilo común

Java proporciona varios grupo de subprocesos común para nosotros, usted puede conseguir fácilmente a través de la clase de los ejecutores. A continuación analizamos estos tipos de parámetros utilizados por el grupo de subprocesos, para entender las similitudes y diferencias entre estos grupo de subprocesos.

  1. newSingleThreadExecutor

Ye Literalmente, se trata de una piscina de un solo hilo de rosca, sus parámetros de configuración son las siguientes (tiempo de la creación no requiere la participación masiva, aquí se refiere a la participación de las masas en el siguiente nivel del grupo de subprocesos llamar al constructor):

corePoolSize :. 1
maximumPoolSize (la maxPoolSize) :. 1
KeepAliveTime: 0L
WorkQueue: a LinkedBlockingQueue
otros parámetros por defecto

Vamos de nuevo, de acuerdo con el brillo de la simulación diagrama de flujo de trabajo presentado anteriormente, usted sabe por qué esto es una agrupación de hebras de hilo simple.

Cuando las misiones habían presentado, se creará un hilo para realizar la tarea, al presentar la segunda tarea, ya que el valor corePoolSize es 1, por lo que la tarea se coloca en la cola de trabajos. Desde la selección de cola de tareas es LinkedBlockingQueue, la estructura subyacente es la lista, en teoría, se puede almacenar el número casi infinito de tareas (el tamaño predeterminado es Integer.MAX_VALUE), nunca se desencadena la cola de tareas está llena, no va a continuar para siempre aumentar el hilo, el grupo de subprocesos puede seguir trabajando un solo subproceso.

Aunque sólo sea porque el hilo finaliza de forma anómala, el grupo de subprocesos se creará en una nueva rosca hacia arriba. Mediante el bloqueo de cola, el grupo de subprocesos para asegurar que las tareas se ejecutan de forma secuencial.

  1. newFixedThreadPool

Este es un número fijo de hilos en el grupo de subprocesos, sus parámetros de configuración son las siguientes:

corePoolSize n-
maximumPoolSize (la maxPoolSize): n-
KeepAliveTime: 0L
WorkQueue: a LinkedBlockingQueue
otros parámetros por defecto

Si usted entiende cómo SingleThreadExecutor límite es sólo un hilo para realizar la tarea, entonces el principio de un número fijo de las discusiones aquí es la misma, la clave es definir corePoolSize y maxPoolSize del mismo tamaño y utilizar la capacidad casi ilimitada LinkedBlockingQueue

  1. newCachedThreadPool

Puede ser almacenado en caché grupo de subprocesos, entiendo que la memoria caché se almacena en caché en el hilo, sus parámetros de construcción son las siguientes:

corePoolSize: 0
maximumPoolSize (la maxPoolSize): Integer.MAX_VALUE
KeepAliveTime: 60L
WorkQueue: SynchronousQueue
otros parámetros por defecto

Después de la debida corePoolSize es 0, por lo que la tarea se presentará a la agrupación de hebras directamente a la cola de bloqueo. También, porque el bloqueo de usos cola SynchronousQueue, que es una tarea no se almacenan en la cola, será tarea una vez subproceso de procesamiento tarea distribuida, desencadena directamente el diagrama de flujo en el tercer bloque determina: si la corriente es menor que el número de hilos en maxPoolSize crear un hilo. Desde maxPoolSize estableció un gran valor, básicamente se puede crear un hilo de forma indefinida, tomar un descanso en un número específico de JVM número máximo de hilos que se pueden crear. Si el hilo está inactivo 60 segundos TASKING no será reciclado grupo de subprocesos.

El grupo de subprocesos tiene cuando se trata de un gran número de tareas a corto enlace asíncrono mejor rendimiento, en su tiempo libre es ningún grupo de subprocesos, el ahorro de los recursos del sistema.

  1. newScheduledThreadPool

corePoolSize: Custom
maximumPoolSize (el maxPoolSize): Integer.MAX_VALUE
KeepAliveTime: 0
WorkQueue: DelayedWorkQueue
otros parámetros por defecto

Desde maxPoolSize establece Integer.MAX_VALUE, el hilo grupo de subprocesos puede crear ilimitada, porque la cola de bloqueo seleccionado DelayedWorkQueue, puede realizar tareas periódicamente.

  1. newWorkStealingPool

Esto es JDK1.8 agrupación de hebras recién añadido, la parte inferior con ForkJoinPool. Si se utilizan los parámetros por defecto se crea, a continuación, el grupo de subprocesos puede crear tantos procesos para alcanzar y sistemas para que coincida con las capacidades de procesamiento paralelo. Cada hilo tiene su propia cola de trabajos, si el trabajo hilo actual ha terminado, irá a otra cola de trabajos "robar" la ejecución de la tarea, la capacidad de utilizar completamente la CPU de varios núcleos.

Alibaba acerca de la regulación en la creación de un grupo de subprocesos

El siguiente pasaje de la manipulación manual de Alibaba Java desarrollo, creo que después de leer los parámetros anteriores y explicar las similitudes y diferencias de grupo de subprocesos distintos, no es difícil entender las reglas acerca de esto:

(Vi) el procesamiento simultáneo
4. [obligatorios] Ejecutores grupo de subprocesos no se les permite crear, pero a modo ThreadPoolExecutor, este enfoque permite a los estudiantes a escribir grupo de subprocesos normas de funcionamiento más explícito, para evitar el riesgo de agotamiento de los recursos.

Descripción: Executors regresan a los inconvenientes de la piscina hilo como sigue:
. 1) y FixedThreadPool SingleThreadPool:
permisible longitud cola de solicitudes de Integer.MAX_VALUE, se puede acumular un gran número de solicitudes, causando con ello OOM.
2) CacheThreadPool y ScheduledThreadPool:
le permite crear un número de hilos a Integer.MAX_VALUE, puede crear un gran número de hilos, lo que resulta OOM.

3. El número de grupo de subprocesos a la cantidad es la adecuada?

La respuesta a este problema no es fijo, podemos empezar por autoridad de la industria dado el número de fórmulas para el cálculo de la agrupación de hebras, y luego confirmado por una serie de medición de la presión específica.

Orientación está dada por la industria de la fórmula:

  1. Si la tarea es tareas intensivo de la CPU (como el cifrado, el cálculo de hash, etc.), el número de hilos se puede ajustar a aproximadamente 1-2 veces el número de núcleos de CPU.

  2. Si la tarea es tareas lentas tipo IO (tales como lectura y escritura de bases de datos, archivos, red, etc.), la fórmula para el número de hilos: threads = núcleos de CPU * (1 + tiempo de espera medio / tiempo de procesamiento promedio)

Estos dos diseños diferentes han seguido el principio de tratar de exprimir el rendimiento de la CPU.

4. cinco estados de subprocesos

Cinco estados del grupo de subprocesos se escriben en una clase ThreadPoolExecutor, y que son:

  1. RUNNING: Aceptar las nuevas tareas y hacer frente a nuevas tareas
  2. APAGADO: no aceptan nuevas tareas, pero se encargará de la cola de tareas
  3. STOP: no aceptar la nueva tarea, la cola de tareas no maneja la tarea de interrupción está procesando
  4. Poner en orden: Todas las tareas se han terminado, workerCount cero, entonces el hilo irá Estado poner en orden y ejecutar terminado método de gancho ()
  5. Terminación: operación terminado () completó

5. El principio de funcionamiento del grupo de subprocesos

Echemos un vistazo a cómo crear un nuevo hilo de las tareas de procesamiento, leer el grupo de subprocesos para mirar el principio es simple:

//首先把我们要放在线程里运行的代码在Runnable接口实现类的run方法中封装好

class MyTask implements Runnable {

    @Override
    public void run() {
        System.out.println("处理任务 + 1");
    }
}

//然后创建一个线程,把该Runnable接口实现类作为构造参数传给线程

public class Basic {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyTask());
        thread.start();
    }
}
//最后调用线程的start方法运行,实际上调用的是Runnable的run方法

En los implementos de código por encima de la instancia Ejecutable interfaz pasa a la clase de hilo, se convirtió en un objeto de rosca variable miembro, el hilo se ejecuta cuando el método run llama la instancia.

Si puede ver un hilo de nueva creación para realizar la tarea, la tarea y el hilo acoplados entre sí. El principio clave del grupo de subprocesos es que añade una cola de bloqueo, el desacoplamiento de las tareas y los hilos

En el grupo de subprocesos, existe el concepto de un trabajador, un poco difícil de explicar este concepto, se puede entender simplemente como un trabajador es un subproceso de trabajo que la tarea en la mano, cuando el método de llamada de grupo de subprocesos runWorker (), el hilo el procesamiento de una tarea, para más detalles ver el código de abajo

final void runWorker(Worker w) {
    Thread wt = Thread.currentThread();
    Runnable task = w.firstTask;
    w.firstTask = null;
    w.unlock(); // allow interrupts
    boolean completedAbruptly = true;
    try {
        while (task != null || (task = getTask()) != null) {//会到阻塞队列中获取任务
            w.lock();
            //...
            try {
                //执行任务
            } finally {
                //...
                w.unlock();
            }
        }
        //...
    } finally {
        //...
    }
}

Se puede ver el código de la llave del código en el grupo de subprocesos es un bucle while, mientras que el bucle continuará para obtener la tarea cola de bloqueo para llegar a la ejecución de la tarea.


referencia:

  1. la red mu clase "Diversión Java utilidades de concurrencia, JUC competentes, se complican por el generalista" por supuesto
  2. https://www.oschina.net/question/565065_86540
  3. https://www.cnblogs.com/dolphin0520/p/3932921.html
  4. https://www.cnblogs.com/ok-wolf/p/7761755.html

Supongo que te gusta

Origin www.cnblogs.com/tanshaoshenghao/p/12626462.html
Recomendado
Clasificación