creo que entendí lo que se confuzzabling así que aquí está mi respuesta más larga: la terminología es un poco pequeña engañosa (obviamente, o no lo haría esa pregunta poniendo específicamente el énfasis en la 'reutilización'):
¿Cómo roscan los hilos 'reutilizar'?
Lo que ocurre es que un solo hilo se puede utilizar para procesar varias tareas (normalmente pasan como Runnable
, pero esto depende de su marco 'ejecutor': los ejecutores defecto acepta Runnable
, pero se puede escribir su propia "ejecutor "/ thread-pool acepta algo más complejo que Runnable
[como, digamos, CancellableRunnable
]).
Ahora en la implementación predeterminada ExecutorService
si un hilo se termina de alguna manera mientras todavía está en uso, se reemplaza automáticamente con un nuevo hilo, pero esto no es la 'reutilización' de la que están hablando. No hay "reutilización" en este caso.
Por lo tanto, es cierto que no se puede llamar start()
en un hilo de Java doble pero se puede pasar la mayor cantidad Runnable
como usted quiere un ejecutor y cada run()
método Runnable
's se reunirá una vez.
Puede pasar 30 Runnable
a 5 de Java Thread
y cada subproceso de trabajo puede estar llamando, por ejemplo, run()
6 veces (prácticamente no hay garantía de que usted va a encontrarse cumpliendo exactamente 6 Runnable
por Thread
pero eso es un detalle).
En este ejemplo, start()
se habría llamado 6 veces. Cada uno estos 6 start()
llamarán exactamente una vez el método run()
de cada Thread
:
De Thread.start()
Javadoc:
* Causes this thread to begin execution; the Java Virtual Machine
* calls the <code>run</code> method of this thread.
PERO luego dentro método de cada hilo run()
se quita de la cola Runnable
y se llamará al método run()
de cada Runnable
. De modo que cada subproceso puede procesar varios Runnable
. A eso se refieren por "reutilización de hilo".
Una manera de hacer su propio grupo de subprocesos es utilizar una cola de bloqueo en la cual se ponga en cola runnables y tienen cada uno de sus hilos, una vez que termine de procesarse el método de un Runnable
run()
, dequeue la siguiente Runnable
(o bloque) y ejecute su método run()
, luego enjuague y repita.
supongo que parte de la confusión (y es un poco confuso) viene del hecho de que un Thread
toma un Runnable
y al llamar start()
run()
método de la Ejecutable 's se llama mientras que los grupos de subprocesos predeterminado también toman Runnable
.
tl; dr Los subprocesos del grupo de subprocesos básicamente se ejecutan bucles que extraen las tareas enviadas de una cola.Los subprocesos no dejan de ejecutarse cuando sirven una tarea, solo esperan a que el siguiente se envíe a la cola. Nunca se "vuelven a ejecutar" como se le preguntó en la pregunta, ya que solo están funcionando constantemente. – Sogger