Con el creciente número de núcleos de CPU, es inevitable utilizar tecnología de subprocesos múltiples para hacer un uso completo de su potencia informática. Por lo tanto, la tecnología de subprocesos múltiples es una tecnología que los desarrolladores de servidores deben dominar.
La creación y destrucción de hilos involucra llamadas al sistema y consume recursos del sistema, por lo que se introduce la tecnología de agrupación de subprocesos para evitar la creación y destrucción frecuentes de los hilos.
En Java, hay una clase de herramientas de ejecutores que puede crear un grupo de hilos para nosotros. La esencia es nueva un objeto Threadpoolexecutor. Los piscinas de hilos son casi una toma imprescindible en las preguntas de la entrevista. Esta sección combina el código fuente para hablar sobre el principio de funcionamiento de ThreadExecutor
1. Creación de la piscina de hilos
Primero veamos los parámetros del constructor más completos de Threadpoolexecutor:
① CorePoolSize: el número de hilos centrales en el grupo de subprocesos. Para decirlo sin rodeos, incluso si no hay tareas en el grupo de subprocesos, habrá hilos corepoolsize esperando tareas.
②MaxImumumpoolSize: el número máximo de hilos. No importa cuántas tareas envíe, el número máximo de subprocesos de trabajadores en el grupo de subprocesos es MaximoMoolSize.
③ KeepAlivetime: el tiempo de supervivencia del hilo. Cuando el número de hilos en el grupo de subprocesos es mayor que CorePoolSize, si no hay tarea que se ejecute después de esperar a KeepAlivetime, el hilo sale.
⑤unidad: Esto se usa para especificar la unidad de KeepAlivetime, como Seconds: TimeUnit.seconds.
⑥ WorkQueue: una cola de bloqueo, y las tareas enviadas se colocarán en esta cola.
⑦ ThreadFactory: una fábrica de hilos, utilizada para crear hilos, principalmente para nombrar el hilo. El nombre de hilo de fábrica predeterminado es Pool-1-Thread-3.
⑧Handler: rechazar la política, llamado cuando los hilos en el grupo de hilos están agotados y la cola está llena.
Los anteriores son los parámetros utilizados al crear un grupo de subprocesos. Los entrevistadores a menudo hacen esta pregunta durante las entrevistas.
2. Proceso de ejecución del grupo de subprocesos
Aquí hay un diagrama para ilustrar el proceso de ejecución del grupo de subprocesos
Cuando se envía una tarea al grupo de subprocesos, primero determinará si el número actual de subprocesos es menos que corepoolSize. Si es menos que, se creará un hilo para ejecutar la tarea enviada. De lo contrario, la tarea se colocará en la cola de trabajo. Si el trabajo de trabajo está lleno, determinará si el número actual de subprocesos es menor que MaximumumpoolSize. Si es menos que, se creará un hilo para ejecutar la tarea. De lo contrario, se llamará a un controlador para indicar que el grupo de hilos se niega a recibir la tarea.
Aquí, tome el código fuente de JDK1.8.0_111 como ejemplo para ver la implementación específica.
1. Primero mire el método del ejecutor del grupo de subprocesos
①: Determine si el número actual de hilos activos es menor que CorePoolSize. Si es menor que, llame a AddWorker para crear un hilo para ejecutar tareas
②: Si no es menos que corepoolSize, agregue la tarea a la cola de trabajo.
③: Si el trabajo se pone en el trabajo de trabajo, el hilo de creación ejecutará la tarea. Si el hilo de creación falla en este momento (el número actual de subprocesos no es menor que MaximummoolSize), se llamará a rechazar (controlador de llamadas internos) y se negará a aceptar la tarea.
2. Veamos la implementación del método AddWorker
Esta pieza de código es cuando se crea un hilo no corre, es decir, el núcleo es igual a falso. Determine si el número actual de subprocesos es mayor o igual a MaximoMoolSize. Si es mayor o igual a falso, es decir, la creación del hilo falló en ③ mencionado anteriormente.
La segunda mitad del método addWorker:
① Crear un objeto de trabajador e instanciar un objeto de subproceso.
② Instarte este hilo
3. Vaya al trabajador para ver su implementación
Puede ver que ThreadFactory se llama al crear un trabajador para crear un hilo. Iniciar un hilo en el anterior ② activará el método de ejecución del trabajador a llamar por el hilo.
4. A continuación, echemos un vistazo a la lógica del método del corredor.
El hilo llama a Runwoker, y llamará al método GetTask mientras bucle para leer la tarea de WorkerQueue, y luego ejecutará la tarea. Mientras el método GetTask no devuelva nulo, este hilo no saldrá.
5. Finalmente, echemos un vistazo a la implementación del método GetTask
① Ignoremos TockCorethreadTimeOut, el valor predeterminado de esta variable es falso. WC> CorePoolSize determina si el número actual de hilos es mayor que CorePoolSize.
② Si el número actual de subprocesos es mayor que CorePoolSize, se llamará al método de la encuesta de trabajo para obtener la tarea, y el tiempo de espera es KeepAlivetime. Si el tiempo de KeepAlivetime excede el límite de tiempo, la encuesta regresa NULL, y el tiempo anterior mencionado anteriormente saldrá en secuencia, y el hilo se ejecutará.
Si el número actual de subprocesos es menor que CorePoolSize, se llamará al método de trabajo de trabajo para bloquear en este momento.
El artículo anterior se basa en el principio de funcionamiento y la interpretación del código fuente de Thread Pool. Este artículo es todo el contenido compartido por el editor. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.