2009-07-21 13 views
11

Một khách hàng của chúng tôi phàn nàn rằng, không thường xuyên, các cuộc gọi của chúng tôi là FileChannel.map không thành công với số ClosedByInterruptException. Javadoc không liệt kê đây là một khả năng hợp pháp. Có ai biết điều gì có thể xảy ra ở đây không?Tại sao chúng ta nhận được ClosedByInterruptException từ FileChannel.map trong Java 1.6?

 
Cause0: java.nio.channels.ClosedByInterruptException 
Cause0-StackTrace: 
at java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:184) 
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:772) 

Trả lời

18

Hoạt động kênh bị ràng buộc vào chuỗi đang thực hiện thao tác. Nếu luồng này bị gián đoạn, luồng/kênh sẽ bị đóng do các vấn đề về an toàn IO.

+0

Loại kết quả hoạt động nào bị gián đoạn như vậy? Nếu tôi muốn viết mã cho một trường hợp thử nghiệm, tôi sẽ làm gì? Tại sao một luồng có thể bị gián đoạn ở giữa ánh xạ một tệp? Còn Claire thì sao? – bmargulies

+4

Nếu ứng dụng là đa luồng, bạn nên tìm #interrupt() - các cuộc gọi có thể làm gián đoạn luồng làm các hoạt động IO trên kênh. Nếu đây là một ứng dụng web hoặc một số loại môi trường được quản lý khác, nơi quản lý luồng không phải là ứng dụng của bạn (như một Vùng chứa Servlet/EJB), bạn nên tìm kiếm các vi phạm an toàn luồng. Một nơi khác cần xem là khi ứng dụng đang tắt hoặc khi sử dụng gộp nhóm (Servlet/EJB Container!). Sau đó, nhận thức được quản lý năng động của kích thước hồ bơi! http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#interrupt() – cafebabe

3

Nhận xét cuối cùng chứa câu trả lời. Đã có một hồ bơi thread được sử dụng, và tại ngắt kết nối đã được giao.

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