thread subprocesos run que objetos metodo hilos funcion java multithreading threadpool

java - run - Cómo un grupo de subprocesos en caché reutiliza subprocesos existentes



objetos runnable en java (6)

Acabo de empezar a buscar en la clase Executors de Java y en el método newCachedThreadPool( ) . Según la API, el grupo de hilos resultante reutiliza los objetos Thread existentes para nuevas tareas.

Estoy un poco sorprendido de cómo se implementa esto porque no pude encontrar ningún método en la API Thread que te permita establecer el comportamiento de un objeto Thread existente.

Por ejemplo, puede crear un nuevo Thread desde un objeto Runnable , lo que hace que Thread llame al Runnable run( ) Runnable . Sin embargo, no hay ningún método de establecimiento en la API Thread que toma un Runnable como argumento.

Apreciaría cualquier puntero.


Básicamente imagina cada hilo de la piscina haciendo esto:

public void run() { while(true) { if(tasks available) { Runnable task = taskqueue.dequeue(); task.run(); } else { // wait or whatever } } }


Bueno, el hilo solo tiene que llamar a Runnable.run() en los runnables que le son asignados ...


El grupo de subprocesos tiene subprocesos que buscan trabajos ejecutables. En lugar de iniciar un nuevo hilo desde Runnable el hilo solo llamará a la función run() . Por lo tanto, un subproceso en un ThreadPool no se crea con el Runnable que proporcionas, sino con uno que simplemente comprueba si alguna tarea está lista para ejecutarse y la llama directamente.

Así se vería algo como esto:

while(needsToKeepRunning()){ if(hasMoreTasks()){ getFirstTask().run();. } else { waitForOtherTasks(); } }

Por supuesto, esto se simplifica demasiado, la implementación real con la espera es mucho más elegante. Una gran fuente de información sobre cómo funciona esto realmente se puede encontrar en Concurrencia en la práctica.



Los subprocesos se crean solo una vez en la API del conjunto de subprocesos (excepto en los casos en que, debido a alguna excepción, el subproceso se cierra abruptamente)

Los subprocesos de trabajo sondean la cola para ver si hay una tarea y usarla. Así que los hilos nunca salen.

Es solo una abstracción que los subprocesos se reutilizan (la abstracción para que nunca se detenga). Obviamente, se detienen después de un tiempo de inactividad y una solicitud de apagado.

Runnable -----> Grupos de subprocesos (algunos subprocesos de trabajo consumen ese Runnable y otros esperan más Runnables)


Una explicación simplificada es que cuando pasa un Runnable al ExecutorService, el Runnable se pone en una cola. Los subprocesos de trabajo de ThreadPool se leen de esta cola e invocan el método runnables run () en cola.