2009-07-21 20 views
11

私たちの顧客は、散発的にFileChannel.mapへの私たちの電話はClosedByInterruptExceptionで失敗すると不平を言う。 Javadocはこれを正当な可能性として挙げていません。誰がここで何が起こっているかも知っていますか?Java 1.6のFileChannel.mapからClosedByInterruptExceptionが発生するのはなぜですか?

 
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) 

答えて

18

チャネル操作は、操作を行うスレッドにバインドされます。このスレッドが中断された場合、IO安全性の問題のためにストリーム/チャネルが閉じられます。

+0

どのような操作がこのような割り込みを引き起こしますか?テストケースをコーディングしたいと思ったら、どうすればいいでしょうか?ファイルをマッピングする途中でスレッドが中断するのはなぜですか?クレアはどう? – bmargulies

+4

アプリケーションがマルチスレッドの場合は、#interrupt()呼び出しを参照して、チャネル上でIO操作を実行するスレッドを中断させる必要があります。これがWebアプリケーションやその他の管理対象環境で、スレッド管理がアプリケーション(Servlet/EJB Containerなど)に依存しない場合は、スレッド安全違反を探す必要があります。 もう1つの場所は、アプリケーションがシャットダウンしているとき、またはスレッドプーリングが使用されているときです(Servlet/EJB Container!)。プールサイズの動的管理に注意してください! http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#interrupt() – cafebabe

3

最後のコメントには回答が含まれています。使用中のスレッドプールがあり、シャットダウン時に割り込みが発生しました。