Cómo reutilizar hilos Threadpool y cómo funciona


Mis conceptos de Multihilo son débiles e intentan aprender.

En Java lo que sé es que no podemos llamar a un hilo más de una vez, es decir,

Thread t = new Thread(//Some Runnable);
t.start()

t.start() //Illegal and throw Exception at Runtime.

Por lo que sé, lanza una excepción cuando llamas a t.start() de nuevo porque la pila asociada para el Hilo se destruye una vez que sale del método run() y estás tratando de inicializar las cosas de nuevo.

En ese caso, lo que sé sobre Threadpool es que da un mejor rendimiento y ahorra tiempo porque no hay necesidad de crear un nuevo hilo. (Leo en http://www.javatpoint.com/thread-pooling-in-java )

Si no hay necesidad de crear un nuevo hilo en el escenario ThreadPool, entonces cómo funciona con el mismo hilo que acaba de terminar su método de ejecución, ¿se puede volver a usar ese hilo?

Leí esto, http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html y dice que " La mayoría de las implementaciones de ejecutor en java.útil.uso concurrente de grupos de subprocesos, que consisten de hilos de trabajo. Este tipo de subproceso existe por separado de las tareas ejecutables y ejecutables que ejecuta y a menudo se usa para ejecutar múltiples tareas."

Entonces, ¿qué es el hilo de trabajo aquí, es algo diferente a los hilos de Java normales?

Con este enlace ¿Cómo Reutiliza un Grupo de Subprocesos en caché los Subprocesos existentes Tengo algo, pero sigo confundido sobre qué tipo de cosas se pueden eliminar cuando usamos el Grupo de Subprocesos y qué da un mejor rendimiento que el uso normal Java Thread.

Así que podemos decir así,

El hilo tiene tres partes,

  1. Creación (Diciéndole al sistema operativo que es un hilo nuevo, cree una pila para él.)
  2. Ejecutar el método runnable ie run ().
  3. Destruyendo hilos.

Por lo tanto, teniendo en cuenta los pasos anteriores de 3, con Threadpool el paso 1 y el Paso 3 se pueden eliminar después de un número fijo de creación de Subprocesos. solo se ejecutará el paso 2 para cada tarea, ¿por eso Threadpool es más rápido? ¿podemos decir así? soy yo ¿correcto?

Author: Community, 2013-11-04

4 answers

Si no hay necesidad de crear un nuevo hilo en el escenario ThreadPool, entonces cómo funciona con el mismo hilo que acaba de terminar su método de ejecución, ¿se puede volver a usar ese hilo?

Simple - el hilo original nunca se completa. Solo espera a que otra tarea se ejecute. En pseudo-código:

// No, this isn't even slightly accurate! General impression only :)
while (!pool.isShutdown()) {
    Runnable task = pool.waitForTaskOnQueue();
    task.run();
}

(Obviamente, cuando un grupo de subprocesos se cierra, tendría que dejar de esperar hilos de esperar a otra tarea, también - pero con suerte se obtiene el general idea.)

 29
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-04 10:37:54

El proceso funciona en dos partes:

Envío de tareas: Los grupos de subprocesos están estrechamente acoplados con una cola de bloqueo. Cuando decimos ejecutor.ejecutar(runnable). El runnable / callable se pregunta en la cola.

Ejecución de tareas: Ahora las tareas deben recogerse de la cola. Digamos que cada vez que se envía una tarea en la cola, debe ser recogida y ejecutada.

Así que hay hilos que se ejecuta un bucle infinito y ver la cola de tareas. Tan pronto como el las tareas están disponibles un hilo lo recogerá y ejecutará.

 2
Author: Sonu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-27 14:32:53

Por lo tanto, considerando los pasos anteriores a 3, Con Threadpool el paso 1 y el Paso 3 pueden ser eliminado después de un número fijo de creación de subprocesos. solo Paso 2 para cada tarea se ejecutará ¿por eso Threadpool es más rápido? podemos ¿decir así? estoy en lo cierto?

Sí, tienes razón. La creación y destrucción de hilos es una de las tareas costosas. Al igual que en un grupo de subprocesos, los subprocesos ya están creados, por lo que la sobrecarga de la creación de subprocesos no está allí. Pero si tienes hilos mucho más altos que él en caso de tener, será bastante malo para su aplicación. Puede ir OutofMemorry o puede estar en algunos otros temas. Así que para arreglar un tamaño de grupo de subprocesos use la siguiente fórmula:

no of threads = 2 * no_of_cores * no_of_disks * percentage CPU utilization you need * (1 + (W/ C))

(W / C) es la fracción que indica el tiempo de espera para calcular el tiempo.

 1
Author: Trying,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-04 14:58:51

En el grupo de subprocesos En lugar de crear nuevos subprocesos cuando llegan nuevas tareas, un grupo de subprocesos mantiene un número de subprocesos inactivos que están listos para ejecutar tareas según sea necesario. Después de que un hilo completa la ejecución de una tarea, no muere. En su lugar, permanece inactivo en el grupo a la espera de ser elegido para ejecutar nuevas tareas.

Puede limitar un número definido de subprocesos concurrentes en el grupo, lo que es útil para evitar la sobrecarga. Si todos los subprocesos están ejecutando tareas muy ocupadas, las nuevas tareas se colocan en un queue, esperando un hilo está disponible

 1
Author: Vinayak Bansal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-19 04:26:02