2012-04-25 6 views
6

yo estaba tratando de escribir un modelo Productor al Consumidor (Productor hilo e hilo al Consumidor en java)manejo de excepciones en el caso de Thread.sleep y esperar() en caso de Temas

Me preguntaba cómo manejar la InterruptedException que se produce por el método y el método Thread.sleep

package producerconsumer; 

import java.util.ArrayList; 

public class Consumer implements Runnable { 

    ArrayList<Integer> container; 

    @Override 
    public void run() { 
     while(true){ 
     System.out.println("Consumer Thread Running"); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     if(null==container){ 
      System.out.println("container is null"); 
     } 
     //Removing values from Arraylist 
     synchronized (container) { 
      if(container.size()==0){ 
       try { 
        container.wait(); 
       } catch (InterruptedException e) { 
        //How to tackle this exception 
        e.printStackTrace(); 
       } 
      } 
      Integer removedInteger = container.remove(container.size()-1); 
      System.out.println("removedInteger..."+removedInteger); 
     } 
     } 
    } 

    public void setContainer(ArrayList<Integer> container) { 
     this.container = container; 
    } 
} 

la Object de Clase wait() este es un ejemplo que he tomado, en este ejemplo puede que no haya ninguna necesidad de cuidar de estos excepción (mi suposición).

Pero quería saber cuáles podrían ser los diferentes escenarios posibles en los que tenemos que manejar esta excepción.

+0

posible duplicado de [Manejo de InterruptedException en Java] (http://stackoverflow.com/questions/3976344/handling-interruptedexception-in-java) – assylias

+0

@assylias Gracias por sugerir un buen enlace. Déjame ver esto. –

Respuesta

11

Me preguntaba cómo manejar la excepción interrumpida que se produce por el método Thread.sleep y el método de espera de la clase de objeto

Hay dos cosas importantes a realizar sobre InterruptedException. En primer lugar, cuando se lanza el indicador de interrupción en el Thread se borra. Lo que siempre debe hacer algo como:

} catch (InterruptedException e) { 
    // re-add back in the interrupt bit 
    Thread.currentThread().interrupt(); 
    ... 
} 

Este es un patrón muy importante porque permite que otro código que podría estar llamando a la suya para detectar la interrupción también.

En segundo lugar, en términos de subprocesos, si se interrumpen, lo más probable es que se limpien y cierren. Esto depende de usted, el programador, pero el comportamiento general es terminar y abandonar la operación que se realiza, a menudo porque el programa está intentando cerrar.

} catch (InterruptedException e) { 
    Thread.currentThread().interrupt(); 
    // we are being interrupted so we should stop running 
    return; 
} 

Por último, con cualquier tratamiento de excepciones, la plantilla Eclipse predeterminado suele ser la cosa equivocada hacer. Nunca solo e.printStackTrace(); la excepción. Averigüe qué quiere hacer con él: vuelva a lanzarlo como otra excepción, inicie sesión en algún lugar mejor o salga de la secuencia/método/aplicación.

+0

Otra opción es simplemente volver a lanzar la excepción (en cuyo caso no es necesario volver a interrumpir el hilo). – yshavit

+0

@Gray Gracias por ponerlo de una manera increíble. Solo quería saber si volvemos a lanzar esto como otra excepción. ¿Mi hilo se detendrá? o ¿Continuará el ciclo como si nada hubiera pasado? –

+0

Es una semántica simple de Java. No hay absolutamente ninguna magia. Su llamada a 'dormir' o' esperar' arrojó una excepción. La ejecución continúa como si fuera una 'IOException' de, digamos,' InputStream.read'. –