2009-10-13 6 views
5

Từ J2ME doc chúng ta biết rằng:Nguyên nhân của InterruptedException

java.lang.InterruptedException Ném khi một thread đang chờ, ngủ, hoặc nếu không dừng lại một thời gian dài và thread khác làm gián đoạn nó.

Câu hỏi đặt ra là nếu có thể có ngoại lệ như vậy nếu từ một chủ đề tôi gọi Thread.Interupt() cho chuỗi khác trong đó phương thức Run() của chuỗi khác đang chờ trên InputStream.Read (char [] buf)?

Trả lời

5

Hành vi của blocking đọc để đáp ứng với sợi ngắt là, trên thực tế, không xác định. Xem this long-standing bug để biết chi tiết. Ngắn của nó là đôi khi bạn nhận được EOF, đôi khi bạn nhận được IOException.

+3

Thông thường, bạn không nhận được bất cứ điều gì. – erickson

+0

NB Các từ lâu lỗi đã được giải quyết trong năm 2011: "Đây không còn là một vấn đề trong JDK7 vì di sản ngắt I/O được tắt theo mặc định trên Solaris Nó không bao giờ được thực hiện trên Winodws, và không được triển khai trên Linux từ jdk1.. 3. " – EJP

4

Thật không may, không, java.io.* lớp không đáp ứng với sự gián đoạn khi họ bị chặn ở chế độ đọc hoặc viết phương pháp. Thông thường những gì bạn phải làm là đóng luồng và sau đó xử lý các IOException được ném. Tôi có mô hình này lặp đi lặp lại suốt mã của tôi:

try { 
    for (;;) { 
     try { 
      inputStream.read(data); 

      thread.join(); 
     } 
     catch (IOException exception) { 
      // If interrupted this isn't a real I/O error. 
      if (Thread.interrupted()) { 
       throw new InterruptedException(); 
      } 
      else { 
       throw exception; 
      } 
     } 
    } 
} 
catch (InterruptedException exception) { 
} 

Ngoài ra các java.nio.* lớp mới làm gián đoạn xử lý tốt hơn và tạo ra InterruptedIOException s khi họ đang bị gián đoạn. Lưu ý rằng ngoại lệ này bắt nguồn từ IOException chứ không phải từ InterruptedException vì vậy, bạn có thể cần hai mệnh đề catch để xử lý một trong hai loại ngoại lệ, một cho InterruptedException và một cho InterruptedIOException. Và bạn sẽ muốn có bất kỳ khoản IOException bắt bên trong để bỏ qua InterruptedIOException s.

+0

Đáng tiếc là phương pháp gián đoạn() không được thực hiện trong j2me – Pirks

+1

Đó là sự thật, và không phải trong Thread.interrupt(). Vì vậy, gián đoạn của bạn sẽ đến từ đâu? Điều gì thúc đẩy câu hỏi? –