我认为当其他线程调用调用线程上的interrupt()方法时,会抛出FileChannel的方法transferTo()中的ClosedByInterruptException。
例如:
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
public class Test {
public static void main(final String[] args) throws Exception {
final RandomAccessFile fromFile = new RandomAccessFile("d:/pp.dat", "rw");
final FileChannel fromChannel = fromFile.getChannel();
final RandomAccessFile toFile = new RandomAccessFile("d:/out.dat", "rw");
final FileChannel toChannel = toFile.getChannel();
final long position = 0;
final long count = fromChannel.size();
final Runnable r = new Runnable() {
@Override
public void run() {
try {
fromChannel.transferTo(position, count, toChannel);
} catch (final IOException e) {
e.printStackTrace();
}
}
};
final Thread t = new Thread(r);
t.start();
t.interrupt();
}
}
关于你提出的关于另一个线程同时写作的问题(如果我理解正确你的问题),来自javadoc:
多个并发线程可以安全地使用文件通道。按照 Channel 接口的规定,可以随时调用 close 方法。在任何给定时间,只有一项涉及通道位置或可以更改其文件大小的操作正在进行;在第一个操作仍在进行时尝试启动第二个此类操作将阻塞,直到第一个操作完成。其他操作,特别是那些采取明确立场的操作,可以同时进行;他们是否真的这样做取决于底层实现,因此未指定。
该类的实例提供的文件视图保证与同一程序中其他实例提供的同一文件的其他视图一致。但是,由于底层操作系统执行的缓存和网络文件系统协议引起的延迟,此类实例提供的视图可能与其他并发运行的程序看到的视图一致,也可能不一致。无论这些其他程序是用什么语言编写的,也不管它们是在同一台机器上还是在其他机器上运行,这都是正确的。任何此类不一致的确切性质取决于系统,因此未指定。