¿Es necesario cerrar la cola linkedblockingqueue de threadpoolexecutor?
2. Al llamar al método ejecutar() para agregar una tarea, el grupo de subprocesos realizará los siguientes juicios:
a. cree un subproceso inmediatamente Ejecute la tarea;
b. Si el número de subprocesos en ejecución es mayor o igual que corePoolSize, coloque la tarea en la cola.
c. Si la cola está llena y el número de subprocesos en ejecución es menor que el tamaño máximo de Pool, cree un subproceso para ejecutar la tarea
d. de subprocesos en ejecución es menor que el tamaño máximo de grupo. Si el número de subprocesos es mayor o igual que el tamaño máximo de grupo, el grupo de subprocesos genera una excepción y le dice a la persona que llama "Ya no puedo aceptar ninguna tarea".
3. Cuando un hilo completa una tarea, selecciona la siguiente tarea de la cola para su ejecución.
4. Cuando un subproceso no tiene nada que hacer durante más de un cierto período de tiempo (keepAliveTime), el grupo de subprocesos determinará si el número de subprocesos actualmente en ejecución es mayor que corePoolSize y luego detendrá el subproceso. Por lo tanto, una vez completadas todas las tareas del grupo de subprocesos, eventualmente se reducirá al tamaño de corePoolSize.
Este proceso muestra que la tarea agregada primero no necesariamente se ejecutará primero. Suponiendo un tamaño de cola de 4, corePoolSize de 2 y MaximumPoolSize de 6, cuando se agregan 15 tareas, el orden de ejecución es el siguiente: las tareas 1 y 2 se ejecutan primero, luego las tareas 3 a 6 ingresan a la cola. Cuando la cola está llena, las tareas 7, 8, 9 y 10 se ejecutan inmediatamente, mientras que las tareas 11 a 15 generan una excepción. El orden final es: 1, 2, 7, 8, 9, 10, 3, 4, 5, 6. Por supuesto, este proceso es para ArrayBlockingQueue