2011-07-28 19 views
9

Comenzó varios subprocesos de trabajo, necesita notificarlos para detenerse. Debido a que algunos de los hilos dormirán por un tiempo antes de la próxima ronda de trabajo, necesitan una forma que pueda notificarlos incluso cuando estén durmiendo.¿Mejor manera de indicar que otro hilo se detenga?

Si fuera la programación de Windows, podría usar las funciones de Evento y de espera. En Java que estoy haciendo esto mediante el uso de un objeto CountDownLatch que cuentan: 1. funciona, pero no se siente elegante, sobre todo tengo que comprobar el valor de recuento para ver si necesidad de salir:

run(){ 
    while(countDownLatch.count()>0){ 
      //working 
      // ... 
      countDownLatch.wait(60,TimeUnit.SECONDS); 
    } 
} 

semáforo es otro elección, pero tampoco se siente muy bien. Me pregunto si hay alguna forma mejor de hacer esto. Gracias.

+1

Esto no es exactamente la respuesta que está buscando, pero debería utilizar los grupos de subprocesos (java.util.concurrent). Estoy casi seguro de que pueden hacer lo que quieres y están libres de errores y puedes usar tu tiempo para desarrollar otras cosas. – toto2

+0

¿Desea detener todos los hilos, o solo quiere detener unos pocos? – Moonbeam

+1

@Moonbeam Necesito detenerlos individualmente, por lo que la agrupación de subprocesos no parece ser una solución viable. – HourseArmor

Respuesta

7

El mejor enfoque es interrupt() the worker thread.


Thread t = new Thread(new Runnable(){ 
    @Override 
    public void run(){ 
     while(!Thread.currentThread().isInterrupted()){ 
      //do stuff 
      try{ 
       Thread.sleep(TIME_TO_SLEEP); 
      }catch(InterruptedException e){ 
       Thread.currentThread().interrupt(); //propagate interrupt 
      } 
     } 
    } 
}); 
t.start(); 

Y todo el tiempo que tiene una referencia a t, todo lo que se requiere para "detener" t es invocar t.interrupt().

+4

Me gusta el hecho que mencionaste para interrumpir nuevamente ya que la bandera interrumpida se borra. –

0

Utilice el marco de interrupción de hilo integrado. Para detener un hilo de trabajo llame al workerThread.interrupt(), esto causará que ciertos métodos (como Thread.sleep()) arrojen una excepción interrumpida. Si sus hilos no llaman a métodos interrumpibles, entonces necesita verificar el estado interrumpido.

En el subproceso de trabajo:

run() { 
    try { 
     while(true) { 
      //do some work 
      Thread.sleep(60000); 
     } 
    } 
    catch(InterruptedException e) { 
     //told to stop working 
    } 
} 
0

buena manera es interrupt() hilos, y en el interior ciclo de maquillaje hilo como

try { 
    while (!Thread.interrupted()) { 
     ... 
    } 
} catch (InterruptedException e) { 
    // if interrupted in sleep 
} 

que tener en cuenta ambos casos cuando se interrumpa:

  • si sleep o wait entonces InterruptedException ser arrojado;
  • En otros casos, la bandera interrumpida se configurará para el hilo que debe verificar usted mismo.
0

El otro mejor enfoque sería utilizar el método interrupt().

por ejemplo He aquí cómo un hilo utiliza esta información para determinar si es o no debe terminar:

public class TestAgain extends Thread { 
      // ... 
      // ... 
     public void run() { 
       while (!isInterrupted()) { 
        // ... 
        } 
       }  
      } 
0

Tener un grupo de subprocesos que usaría el ExecutorService o una ScheduledExecutorService para tareas periódicas retardados /.

Cuando quieren que los trabajadores dejen puede utilizar

executorService.shutdown(); 
+0

Tendría que usar shutdownNow() sin embargo. – kervin

Cuestiones relacionadas