ava grupo de subprocesos ThreadPoolExecutor de KeepAliveTime = 0, significa que más de unos pocos extremos de hilo hilo de núcleo inmediatamente cuando está inactivo

Hoy en día, mis colegas repente plantearon la cuestión por ejemplo, que agrupación de hebras con un buen, newFixedThreadPool y newCacheThreadPool en la selección, dijo grupo de subprocesos de tamaño fijo KeepAliveTime = 0, inactivo hilo se recuperará inmediatamente el hilo con el consiguiente ahorro de recursos y, a continuación, dijo otro colega, siendo 0 el representante nunca se recuperó, también recuerdo la memoria 0 está permanentemente vivo, porque muchos blog en línea, ah, ah, se dice materiales para sobrevivir 0 significa que el hilo de forma permanente en su tiempo libre. Es literalmente delante de sus colegas que piensan que no está probado, sensación permanente -1 no se recupera, a continuación, cada ola fueron estudiados y analizados.

Mire a través del código fuente y encontró KeepAliveTime <0 no se da directamente, es decir, colegas especulan -1 no se recicla está mal, mira el código que se muestra a continuación (no me pregunten cómo sección de códigos marcados en rojo, con vista directa F12 es la página de edición para escribir sus propios estilos de etiquetas van en ..)

público ThreadPoolExecutor (int corePoolSize,
                              int maximumPoolSize,
                              largo KeepAliveTime,
                              unidad TimeUnit,
                              BlockingQueue <Ejecutable> WorkQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        si (corePoolSize <0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize <corePoolSize ||
            KeepAliveTime <0)
            arrojar nueva IllegalArgumentException ();
        si (WorkQueue == null || threadFactory == null || manejador == null)
            nueva nueva NullPointerException de banda ();
        this.acc = System.getSecurityManager () == null?
                nula:
                AccessController.getContext ();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = WorkQueue;
        this.keepAliveTime = Unidad .toNanos (KeepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = Handler;
    }
entonces encontrar uso KeepAliveTime 1:30 no encontrarlos, utilice el código fue probado y encontrado para establecer KeepAliveTime = 0 hilos del núcleo no se recupera, tras colegas dicen que hay una descripción en las artes supuesto complicada por el libro

"Cuando el número de procesos en el mayor grupo de subprocesos que corePoolSize, KeepAliveTime como el exceso de hebras en espera en espera de nuevas tareas más tiempo, el exceso de hilos se dará por terminado después de más de este tiempo. Aquí el conjunto KeepAliveTime a 0L, medios que el exceso de hebras en espera se dará por terminado inmediatamente ".

Colegas comenzaron a confundirse, no me veía al principio, creo que es un error, vuelva a leer la parte de atrás y encontramos esta descripción de texto es decir que la recuperación de la cantidad de hilo de control no básicos KeepAliveTime, que es 0, el número no básicos de hilos vamos a recuperar en su tiempo libre, no quiere decir que se va a recuperar el núcleo.

Para comprobar los resultados, hemos probado con el código, el código de prueba es el siguiente:

com.xhs.concurrent.threaddemo.sync empaquetar;
java.util.concurrent.LinkedBlockingQueue importación;
java.util.concurrent.ThreadPoolExecutor importación;
java.util.concurrent.TimeUnit importación;
 
/ **
 * @author xuhan acumulación 23/04/2019
 * /
implementos ExecutorsDemo clase pública Runnable {
 
    private int i = 0;
 
    ExecutorsDemo pública (int i) {
        this.i = I;
    }
    Void Main (args String []) public static {
        ThreadPoolExecutor ejecutor = new ThreadPoolExecutor (1,2,0, TimeUnit.SECONDS, nuevo LinkedBlockingQueue <Ejecutable> (1));
        for (int i = 0; i <3; i ++) {
            executor.execute (nuevo ExecutorsDemo (i));
        }
        while (true) {
            System.out.println ( "总线程数:" + executor.getPoolSize () + "当前活跃线程数:" + executor.getActiveCount ());
            try {
                TimeUnit.SECONDS.sleep (1);
            } Catch (InterruptedException e) {
                e.printStackTrace ();
            }
        }
    }
    @Override
    public void run () {
        System.out.println ( "i =" + i + "Tema =" + Thread.currentThread () getName ().);
        si (i> = 1) {
            try {
                TimeUnit.SECONDS.sleep (1);
                System.out.println ( "i =" + i + "del sueño 1 s结束");
            } Catch (InterruptedException e) {
                e.printStackTrace ();
            }
        } {else
            try {
                TimeUnit.SECONDS.sleep (3.);
                System.out.println ( "i =" "fin SLEEP S 3." + I +);
            } la captura (InterruptedException E) {
                E. printStackTrace ();
            }
        }
    }
}
hilos de núcleo conjunto y no básicos son hilos 1, capacidad de la cola de 1, 3 en el ejecutable:

En primer lugar crear el hilo principal, el segundo para entrar en la cola, y el tercero es crear un subproceso en ejecución no principal,

La salida es

I = 0 el Tema = la piscina- 1-Thread- 1..
I = 2 el hilo de rosca = la piscina- 1 2-Thread-.
Número total de hilos: 2 número actual de hilos activos: 2
Número total de hilos: 2 número actual de hilos activos: 2
I = 2 del sueño 1 S terminan
i = 1 hilo = pool-1 -2 -thread
número total de hilos: 2 número actual de hilos activos: 2
número total de hilos: 2 número actual de hilos activos: 2
I = termino 1 sueño 1 s
número total de hilos: 1 actual número de hilos activos: 1
número total de hilos: un número actual de hilos activos: 1
. I = 0 S extremo SLEEP 3
número total de hilos: un número actual de hilos activos: 0
después de la no subyacente puede verse que el número de hilos está terminado, la tarea en la cola seguir aplicando, como re-entrar en la cola después de que el final de la tarea, se puede ver el número total de hilos reduce 1, mientras que el otro hilo de núcleo está terminado, encontrado que el número total de hilos no ha disminuido, pero reduciendo el número de hilos activos, que es el número de la base de hilos no se recupera . Libro dice es correcto, la mayor parte del blog en línea dice KeepAliveTime = 0 recuperación no es discrepancias permanentes.

Si desea establecer los hilos del núcleo de recuperación, es necesario conjunto

executor.allowCoreThreadTimeOut (true);
pero es KeepAliveTime debe ser> 0 para el trabajo, de lo contrario se producirá una excepción! ! !

arrojar nueva IllegalArgumentException ( "hilos de núcleo deben tener distinto de cero mantener los tiempos vivos");
Si después de ver tiene un problema, espero que señala algo! ! Gracias! !
----------------
responsabilidad: Este artículo es los bloggers originales artículo CSDN "xuhangsong", y siguen CC 4.0 BY-SA acuerdo de derecho de autor, reproduce, por favor adjuntar el enlace de la fuente original y esta declaración. .
fuente original: https: //blog.csdn.net/xuhangsong/article/details/89474989

Publicado 18 artículos originales · ganado elogios 588 · Vistas 1,03 millones +

Supongo que te gusta

Origin blog.csdn.net/hellozhxy/article/details/104503713
Recomendado
Clasificación