2012-07-11 9 views
9

Estoy tratando de implementar una aplicación de muestra para probar las interfaces Callable y ExecutorService.¿Cómo detener un Callable enviado a ExecutorService?

En mi aplicación He declarado:

ExecutorService exSvc = Executors.newSingleThreadExecutor(); 

continuación:

Future<Integer> test = exSvc.submit(
    new Callable<Integer>() { 
     public Integer call() { 
      for(int i = 0; i < 1000; i++){ 
       System.out.println(i); 
      } 
      return 1; 
     } 
    }); 

Ahora estoy tratando de detener el proceso antes de que termine, estoy usando exSvc.shutdownNow() pero no lo hace trabajo.

Para detener con gracia un clásico Thread suelo utilizar algún tipo de condición variable. ¿Cuál es un enfoque común a seguir con ExecutorService?

Respuesta

16

Future.cancel(true) y ExecutorService.shutdownNow() interrupción uso hilo. Mientras usted no hace llamadas de bloqueo ininterrumpida en su tarea, todo lo que necesita es para manejar la condición interrumpido correctamente, algo como esto:

for(int i = 0; i < 1000; i++){ 
    // Uses isInterrupted() to keep interrupted status set 
    if (Thread.currentThread().isInterrupted()) { 
     // Cannot use InterruptedException since it's checked 
     throw new RuntimeException(); 
    } 
    System.out.println(i); 
} 

Si realiza llamadas de bloqueo continua (como la red IO), cosas volverse más complejo, necesita interrumpirlos manualmente de alguna manera, por ejemplo, cerrando los sockets subyacentes.

+0

¿Hay alguna manera de detener el proceso sin utilizar la interrupción de hilo? – davioooh

+0

No está claro qué es exactamente lo que quieres. 'shutdownNow()' ya usa la interrupción. – axtavt

+0

Sí, de hecho estoy preguntando cómo detenerlo ** sin ** interrupción de hilo. El uso de 'shutdownNow()' es la única manera de detener un hilo enviado a un 'ExecutorService'? – davioooh

3

Así es como lo haría con un FixedThreadPool, espero que sea de alguna ayuda.

ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); 

    List<Future<Void>> results = new ArrayList<>(); 

    for (int i = 0; i < numberOfJobs; i++) { 
     MyCallableJob job = new MyCallableJob (...); 
     results.add(pool.submit(job)); 
    } 

    for (Future<Void> result : results) { 
     try { result.get(); } 
     catch (InterruptedException | ExecutionException ignorable) { } 
    } 

    pool.shutdown(); 
Cuestiones relacionadas