La diferencia entre cerrar el grupo de subprocesos JAVA y cerrar ahora.
Cuando el grupo de subprocesos llama a este método, el estado del grupo de subprocesos cambiará inmediatamente a APAGADO. En este punto, no puede agregar más tareas al grupo o se generará una excepción RejectedExecutionException. Sin embargo, el grupo no sale inmediatamente hasta que se hayan procesado todas las tareas agregadas al grupo.
ShutdownNow()
Según la documentación de JDK, la idea general es que al ejecutar este método, el estado del grupo de subprocesos cambiará inmediatamente a STOP e intentará detener todas las ejecuciones. subprocesos, detendrá las tareas de Manejar que aún esperan en la cola del grupo y, por supuesto, también devolverá aquellas que aún no se han ejecutado.
Intenta terminar el hilo llamando al método Thread.interrupt(), pero como todos sabemos, este método tiene un efecto limitado si no hay suspensión, espera, condición, bloqueo de tiempo, etc. En el hilo, el método de interrupción () no puede interrumpir el hilo actual. Por lo tanto, ShutdownNow() no significa que el grupo de subprocesos pueda salir inmediatamente; es posible que deba esperar a que se completen todas las tareas en ejecución antes de salir.
Lo anterior es un análisis teórico simple de ShuDown() y ShuDownNow(). Si desea saber por qué, debe abrir usted mismo el código fuente del JDK y analizarlo.
Para analizar el código fuente de ShuDown() y ShuDownNow(), recomiendo primero tener un conocimiento aproximado de ThreadPoolExecutor. Esto se debe a que toda la lógica del método para cerrar el grupo de subprocesos se maneja en ThreadPoolExecutor.
Si realmente quieres saber el motivo, te sugiero que leas mi publicación de blog anterior sobre el análisis del código fuente de ThreadPoolExecutor, creo que te ayudará a comprender más a fondo la diferencia entre ShuDown() y ShuDownNow(). diferencia y el principio del grupo de subprocesos de Java.
Sin más preámbulos, verifique el código fuente Primero ingrese el método Shutdown() de ThreadPoolExecutor:
Código de colección de código Java
public void Shutdown() {.
p>
SecurityManager seguridad = System.getSecurityManager();
if (seguridad! = nulo)
seguridad.checkPermission(shutdownPerm); /p>
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
prueba {
if (seguridad! = nulo) { // Comprobar si la persona que llama puede modificar nuestros hilos
for (worker w : Workers)
security.checkAccess(w.thread
} p>
int state = mainLock.
int state = runState;
if (state < SHUTDOWN)
// establece el estado del grupo de subprocesos para apagar
runState = SHUTDOWN; //---------------- código 1
prueba {
para ( Trabajador w : trabajadores) {
// Interrumpir subprocesos uno por uno
w.interruptIfIdle() //-------------- --- código 2
p>
}
} catch for (Trabajador w: trabajadores) {
// Interrumpir hilos uno por uno
w.interruptIfIdle(); //----------------- código 2
}