为什么我们从Java 1.6中的FileChannel.map获取ClosedByInterruptException?

bma*_*ies 15 java nio jdk1.6

我们的一位客户抱怨,偶尔,我们的电话FileChannel.map会失败ClosedByInterruptException.在Javadoc中没有列出这是一个合法的可能性.有谁知道这里会发生什么?

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)

caf*_*abe 24

通道操作绑定到执行操作的线程.如果此线程中断,则由于IO安全问题,流/通道将关闭.

  • 如果应用程序是多线程的,您应该查找#interrupt() - 可能会中断在通道上执行IO操作的线程的调用.如果这是一个Web应用程序或其他类型的托管环境,其中线程管理不适合您的应用程序(如Servlet/EJB容器),则应该查找线程安全违规.另一个需要关注的地方是应用程序关闭或使用线程池时(Servlet/EJB容器!).然后要注意池大小的动态管理!http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#interrupt() (7认同)
  • 什么样的操作导致这种中断?如果我想编写测试用例,我会怎么做?为什么线程在映射文件的过程中会被中断?克莱尔怎么样? (2认同)

bma*_*ies 7

最后一条评论包含答案.正在使用一个线程池,并在关闭中断时交付.