Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Es necesario cerrar la cola linkedblockingqueue de threadpoolexecutor?

¿Es necesario cerrar la cola linkedblockingqueue de threadpoolexecutor?

1. Cuando se crea el grupo de subprocesos por primera vez, no hay ningún subproceso en él. La cola de tareas se pasa como parámetro. Sin embargo, incluso si hay tareas en la cola, el grupo de subprocesos no las ejecutará inmediatamente.

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 de un tamaño específico. Si es LinkedBlockingQueue , debido a que la cola no tiene límite de tamaño, el problema anterior no existe.