2012-04-25 42 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

相關問題