我最近开始将Java AsynchronousFileChannel用于我的项目,我希望尽快写入文件。当我来测试我的项目时,我意识到可能是对我来说不是非同步的读写操作!我创建了一个非常简单的测试程序,通过将字节写入2个文件(每个磁盘一个文件)来查看写入和读取方法是否阻塞。
ByteBuffer bufferc=ByteBuffer.allocate(75000000);//~75MB
ByteBuffer bufferd=ByteBuffer.allocate(75000000);
for (int i=0; i<75000000; i++)
{ bufferc.put((byte)1); bufferd.put((byte)1); }
bufferc.flip(); bufferd.flip();
ExecutorService executor = Executors.newFixedThreadPool(10);
AsynchronousFileChannel channelc =AsynchronousFileChannel.open(Paths.get("C:\\ppp"), getReadWriteOptions(),executor, new FileAttribute<?>[0]);
AsynchronousFileChannel channeld =AsynchronousFileChannel.open(Paths.get("D:\\ppp"), getReadWriteOptions(), executor, new FileAttribute<?>[0]);
long start = System.currentTimeMillis();
System.out.println("start");
Future futurec=channelc.write(bufferc, 0);
System.out.println(futurec.isDone());
Future futured=channeld.write(bufferd, 0);
System.out.println(futured.isDone());
long elapsedTimec = System.currentTimeMillis()- start;
channelc.close();
channeld.close();
System.out.println("time="+elapsedTimec);
因此,我将两个缓冲区写入两个不同的文件中。因为每个缓冲区大约75 MB,我想每个缓冲区都不能立即写入我的磁盘,所以我希望我的输出像
false false time=
这对我来说意味着写操作被“赋予”executorService,程序继续运行。在这个程序的多次运行中,这确实发生在我身上,但并非总是如此。我的意思是,我得到像
这样的输出start true true time=2621
或
start false true time=3039
或者如果我很幸运
start false false time=235
时代真的不同,我甚至不明白为什么我得到前两个输出!我希望有人向我解释影响此输出的因素,和/或我将如何仅获得上述输出中的第3项!