2012-05-02 12 views
6

Soy nuevo en Java y uso un código proporcionado por alguien. Allí, al final del código, interrumpen un hilo si no ha terminado. Estoy midiendo el tiempo del código.java: está interrumpiendo el hilo absolutamente necesario

El problema es que el código Java primero emite todos los hilos, y luego al final interrumpe. ¿Es necesario interrumpir? ¿No podemos esperar hasta que todos los hilos realmente terminen? O puede ser solo omitir la interrupción (estos hilos están ejecutando procesos usando el comando exec de proceso y terminarán de todos modos). Aquí está el código relevante. En primer lugar el código de hilo individual:

String commandString = "./script.scr "; 
    process = Runtime.getRuntime().exec(commandString); 
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    while ((lsString = bufferedReader.readLine()) != null) 
     { 
      System.out.println(lsString); 
     }  
     try 
     { 
      process.waitFor(); 
     } 

Ahora el código de la parte que envía estos hilos:

public void stopWhenAllTaskFinished() 
{ 
    while(notFinished) {sleep(50);} //notFinished is class variable and somewhere else it will set to false. 
    //now finished. 
    //Interrupt all the threads 
    for (int i=0; i<nThreads; i++) { 
     threads[i].interrupt(); 
    } 
} 

Esta función se llama de la clase principal como:

obj.stopWhenAllTaskFinished() 

I enormemente apreciar cualquier idea o respuesta.

+5

Desgraciadamente su descripción es demasiado vaga. La interrupción puede o no ser necesaria. Todo depende de lo que haga el 'Thread'. – Frankie

+0

He agregado el código correspondiente – user984260

+1

Honestamente, parece una prueba paranoica de algo que nunca sucede. – trutheality

Respuesta

1

No está claro si las interrupciones son necesarias desde el código que haya publicado.

  • Si notFinished se establece en false cuando todas las discusiones han terminado, a continuación, las interrupciones son innecesarios.

  • Si notFinished se establece en false cuando existe la posibilidad de que algunos temas no han terminado, entonces podría ser necesario. Si es realmente necesario depende de otras cosas:

    • ¿Estás preparado para que la aplicación espere a que los hilos terminen naturalmente?
    • ¿Puedes estar seguro de que los hilos tendrán un acabado de? (¿Podrían colgar/bloquear para siempre?)
    • ¿Necesita los resultados de su actividad?
    • ¿Responderán a una interrupción? (En este caso, creo que la respuesta es "sí".)
    • ¿Hay algún daño al dejar los hilos allí? (Por ejemplo, ¿se detiene la aplicación de apagar?)
+0

1. Sí, estoy preparado. 2. Sí, terminarán seguramente. 3. No, solo el momento de la aplicación general (cada tarea realizada en el hilo lleva algo de tiempo, pero si se interrumpe: no es bueno). 4. Sí 5. No sé si hay un daño. Mi único requisito es: no se debe eliminar ningún subproceso antes de finalizar y la aplicación general. debería finalizar solo cuando terminen todos los hilos. – user984260

+0

"If notFinished se establece en false cuando todos los hilos han terminado ..." Creo que ese no es el caso. notFinished se modifica antes de que todos los hilos terminen – user984260

+1

Answer 3 significa que las interrupciones en realidad podrían ser dañinas. –

2

El siguiente código que Oracle proporciona en los javadocs es lo que hace la mayoría de las personas. AFAIK, esto está diseñado para matar a los hilos que se niegan a cerrar con gracia después de darles la oportunidad de apagarlos.

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

void shutdownAndAwaitTermination(ExecutorService pool) { 
    pool.shutdown(); // Disable new tasks from being submitted 
    try { 
    // Wait a while for existing tasks to terminate 
    if (!pool.awaitTermination(60, TimeUnit.SECONDS)) { 
     pool.shutdownNow(); // Cancel currently executing tasks 
     // Wait a while for tasks to respond to being cancelled 
     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) 
      System.err.println("Pool did not terminate"); 
    } 
    } catch (InterruptedException ie) { 
    // (Re-)Cancel if current thread also interrupted 
    pool.shutdownNow(); 
    // Preserve interrupt status 
    Thread.currentThread().interrupt(); 
    } 
} 
+1

Sin embargo, esto es para un grupo de subprocesos: la pregunta original no usa un grupo de subprocesos –

+0

Sí, el código usa: subprocesos privados de PoolWorker [] ¿Puede indicar el código adecuado para esto (o dar un re ference). – user984260

+0

Lo siento, publiqué esto antes de que publicara algún código. Analizaré la nueva pregunta. – Jon7

Cuestiones relacionadas