2012-04-25 33 views
6

Tôi đã cố gắng để viết một mô hình sản xuất tiêu dùng (chủ đề sản xuất và tiêu dùng Chủ đề trong java)Exception Handling trong trường hợp Thread.sleep và chờ đợi() phương pháp trong trường hợp Chủ đề

tôi đã tự hỏi làm thế nào để xử lý các InterruptedException được ném bởi Thread.sleep phương pháp và phương pháp wait()Object class

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

Đây là một ví dụ tôi đã thực hiện, trong ví dụ này có thể không có bất kỳ cần phải chăm sóc những ngoại lệ (Assumption của tôi).

Nhưng tôi muốn biết điều gì có thể là các kịch bản khác nhau có thể trong đó chúng tôi cần xử lý ngoại lệ này.

+0

bản sao có thể có của [Xử lý gián đoạn gián đoạn trong Java] (http://stackoverflow.com/questions/3976344/handling-interruptedexception-in-java) – assylias

+0

@assylias Cảm ơn bạn đã đề xuất một liên kết tốt. Hãy để tôi xem xét điều này. –

Trả lời

11

tôi đã tự hỏi làm thế nào để xử lý các ngoại lệ bị gián đoạn đó được ném theo phương pháp Thread.sleep và phương pháp chờ đợi đối tượng Class

Có hai điều quan trọng để nhận về InterruptedException. Trước hết, khi nó được ném cờ ngắt trên Thread sẽ bị xóa. Vì vậy, bạn nên luôn luôn làm điều gì đó như:

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

Đây là một mô hình rất quan trọng vì nó cho phép mã khác có thể đang kêu gọi bạn phát hiện ngắt.

Thứ hai, về chủ đề, nếu chúng bị gián đoạn, chúng có thể sẽ dọn dẹp và bỏ thuốc lá. Điều này chắc chắn tùy thuộc vào bạn, lập trình viên, nhưng hành vi chung là chấm dứt và thoát khỏi hoạt động đang được thực hiện - thường vì chương trình đang cố tắt máy.

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

Cuối cùng, với bất kỳ xử lý ngoại lệ, mẫu Eclipse mặc định thường là điều sai để làm. Không bao giờ chỉ e.printStackTrace(); ngoại lệ. Tìm ra những gì bạn muốn làm với nó: tái ném nó như một ngoại lệ khác, đăng nhập nó ở đâu đó tốt hơn, hoặc thoát khỏi thread/method/application.

+0

Một tùy chọn khác là chỉ cần ném lại ngoại lệ (trong trường hợp này bạn không cần phải ngắt lại chuỗi). – yshavit

+0

@Gray Cảm ơn bạn đã đặt nó một cách tuyệt vời. Chỉ muốn biết nếu chúng ta ném lại điều này như một ngoại lệ khác. Chuỗi của tôi có dừng không? hoặc Vòng lặp sẽ tiếp tục như không có gì xảy ra. –

+0

Đó là ngữ nghĩa Java đơn giản. Hoàn toàn không có phép thuật. Cuộc gọi của bạn tới 'sleep' hoặc' wait' đã ném một ngoại lệ. Việc thực hiện tiếp tục giống như nếu nó là một 'IOException' từ, ví dụ' InputStream.read'. –

Các vấn đề liên quan