2011-01-13 8 views
6

Mi pregunta es levemente complicada. Permítanme intentar explicarlo a fondo, pero si necesitan más detalles, siéntanse libres de preguntarme, los agregaré.¿Cómo se corta un hiloPoolExecutor con hilos 'Ocupados'?

Aprendí recientemente (por experimento) que si un hilo está trabajando continuamente, algo así como una operación entera en un ciclo while (verdadero), interrumpir el hilo no tiene ningún efecto en él. El hilo continúa como si nada hubiera pasado.

Ahora, ThreadPoolExecutors se eliminan mediante los métodos shutdown() o shutdownown(). Revisé el código de estos métodos, ellos usan la llamada a interrupt() para matar un hilo. Entonces, si todos los hilos están ocupados haciendo cosas, ¿cómo matarían a un ejecutor? Cómo se mata, por ejemplo, cuando lo usamos en aplicaciones de primavera.

Uno de estos ejecutor se verá así:

import java.io.File; 
import java.io.IOException; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class Test { 
    public static void main(String[] a) { 
     ExecutorService ex = Executors.newFixedThreadPool(50); 
     for (int i = 0; i < 50; i++) { 
      ex.execute(new Thread() { 
       public void run() { 
        try { 
         File f = File.createTempFile("testfile", "txt"); 
         while (true) { 
          f.canRead(); 
         } 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } finally { 
        } 
       } 
      }); 
     } 

     ex.shutdown(); 
     ex.shutdownNow(); 
    } 
} 

Respuesta

5

Para responder a su pregunta principal, no sería, no menos que la JVM se le dijo de forma explícita a través de la salida System.exit().

Para operaciones de larga duración que deberían ser interrumpibles, es responsabilidad de la implementación verificar el indicador de interrupción a través del Thread.currentThread().isInterrupted().

Por ejemplo:

import java.io.File; 
import java.io.IOException; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class Test { 
    public static void main(String[] a) { 
     ExecutorService ex = Executors.newFixedThreadPool(50); 
     for (int i = 0; i < 50; i++) { 
      ex.execute(new Runnable() { 
       public void run() { 
        try { 
         File f = File.createTempFile("testfile", "txt"); 
         while (!Thread.currentThread().isInterrupted()) { 
          f.canRead(); 
         } 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } finally { 
        } 
       } 
      }); 
     } 

     ex.shutdown(); 
     ex.shutdownNow(); 
    } 
} 

También tenga en cuenta que no es adecuado para crear una instancia de Thread para su uso únicamente como un Runnable. Hacerlo crea una especie de indirección que podría confundir a los programadores más ingenuos.

+0

ohh, no estaba al tanto de eso. Perdón por mi ignorancia Adivina, debería leer algunos libros básicos, tal vez, concurrencia en la práctica. ¡Gracias! – cheekoo

+1

@cheekoo, Java Concurrency in Practice es un libro muy recomendable. La Java efectiva de Joshua Bloch es otra buena opción para una cobertura material un poco más amplia. –

0

Usted no debe estar teniendo un bucle infinate en el código.

El grupo de subprocesos no espera a que salgan los subprocesos.

El hilo se ejecutará siempre hasta que la JVM sale

+0

Estoy de acuerdo, este no es un hilo trabajado ideal, ¿pero quieres decir que un grupo de hilos como este NO se puede matar de ninguna manera? – cheekoo

+0

@cheekoo el ** pool ** será eliminado, pero esos hilos no lo serán. –

+0

Gracias TSM por su respuesta. Esto es interesante, nunca supe que un grupo de subprocesos se puede eliminar mientras los subprocesos que está administrando aún se están ejecutando. Intentaremos depurar eso. Estaba bajo la impresión de que los hilos se mantienen vivos, y también lo hace el grupo. – cheekoo

Cuestiones relacionadas