2012-04-25 71 views
6

我试图写一个生产者消费者模式(生产者线程,并在Java消费者线程)异常处理的Thread.sleep的情况下,等待()方法的线程

我不知道如何处理InterruptedException的情况下,由Thread.sleep方法抛出和Object类的wait()方法

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; 
    } 
} 

这是一个例子我已经采取了,在这个例子中,可能没有任何需要照顾这些异常(我的假设)的。

但我想知道这可能是不同的场景可能在此我们需要处理这个异常。

+0

可能的重复[处理Java中的InterruptedException](http://stackoverflow.com/questions/3976344/handling-interruptedexception-in-java) – assylias 2012-04-25 13:48:26

+0

@assylias感谢您建议一个很好的链接。让我看看这个。 – 2012-04-25 13:53:44

回答

11

我不知道如何处理是通过了Thread.sleep方法和对象类的wait方法抛出的异常中断

有实现约InterruptedException两个重要的事情。首先,当它被抛出时,Thread上的中断标志被清除。所以,你应该总是做这样的事情:

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

这是一个非常重要的模式,因为它允许可能会打电话给你检测中断以及其他代码。

其次,在线程而言,如果他们被中断,他们应该最有可能的清理和退出。这当然取决于你,程序员,但一般的行为是终止并退出正在执行的操作 - 通常是因为程序试图关闭。

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

最后,任何异常处理,默认的Eclipse模板通常是错误的事情。从来没有只是e.printStackTrace();的例外。找出你想要做的事情:重新抛出它作为另一个异常,更好地记录它,或退出线程/方法/应用程序。

+0

另一种选择是重新抛出异常(在这种情况下,您不需要重新中断线程)。 – yshavit 2012-04-25 13:54:00

+0

@Gray谢谢你把它放在一个很棒的方式。只是想知道我们是否再次抛出这个例外。我的线程会停止吗?或者循环会继续发生。 – 2012-04-25 13:58:16

+0

这是简单的Java语义。绝对没有魔法。你对'睡眠'或'等待'的呼叫引发了一个异常。执行继续,就像它是'InputStream.read'的'IOException'一样。 – 2012-04-25 14:02:03