2010-04-22 38 views
5

Cuando termina un hilo, no puede ejecutarlo una vez más, utilizando el método start(): arroja una excepción. ¿Alguien podría explicar, por qué? ¿Qué hay detrás de tal decisión arquitectónica?El hilo se ejecuta solo una vez

Respuesta

7

Porque la forma de tener código ejecutado en un subproceso diferente no es crear un subproceso, que está vinculado a la vista del sistema de lo que es un subproceso (hay infinitos detalles sobre la distinción entre verde y subprocesos del sistema), sino para crear a Runnable, y que se ejecute mediante un subproceso.

Para un código óptimo (ya que la creación de subprocesos consume mucho tiempo), incluso recomendaría que no ejecute Runnable directamente por un hilo, sino por un ExecutorService, que le permitirá usar un grupo de subprocesos sin molestando por todos esos detalles.

+0

Sí! ExecutorService es la mierda, también puede manejar una BlockingQueue. –

2

En última instancia, el hilo vive, y luego muere. Después de todo, el objeto Thread es solo un proxy del subproceso real del sistema operativo debajo. Si quieres otro igual, crea una nueva instancia. ¡No trates de resucitar a los muertos vivientes!

0

Lo que sería aún peor en un sentido arquitectónico es si el hilo nunca terminó, y usted tuvo que matarlo arbitrariamente para evitar que se ejecute.

Coloque un bucle dentro de su método run() si desea ejecutar una rutina más de una vez. Puede usar un método de devolución de llamada para enviar datos/señales a la cadena de llamada y reaccionar cuando ocurran.

+0

No quiero saber cómo solucionar esto, solo quiero saber por qué. – folone

5

Cuando se termina un hilo, no se puede carrera una vez más, el uso de inicio() método:

Corrección: puede llamar a Thread.start() sólo una vez por ejemplo, cualquier llamada posterior arrojará una excepción, no importa si el hilo aún se está ejecutando o no.

Permitir un "reinicio" después de que haya terminado de ejecutarse (claramente es un error mientras el hilo todavía está ejecutándose) requeriría lógica adicional, y evitaría que el tiempo de ejecución liberara recursos como la pila de hilos (que es una cantidad significativa de memoria) hasta que la instancia sea basura recolectada; tal como es ahora, se pueden liberar tan pronto como termine el hilo.

0

aplicación simple para crear los múltiples hilos:

import java.io.*; 

class PWD extends Thread { 
    public void run() { 
    System.out.println(System.getProperty("user.dir")); 
    return; 
    } 
} 
public class HelloMultithread extends Thread{ 
    public static void main(String[] args) throws java.io.IOException { 
     for(int i = 0; i < 10; i++){ 
     PWD p = new PWD(); 
     p.start(); 
     } 
    } 
} 

Como newbee, ayudó a este enlace:

http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html

Cuestiones relacionadas