Java 异步文件通道写入操作,有时阻塞?

Java 异步文件通道写入操作,有时阻塞?,java,Java,我最近开始在我的一个项目中使用Java AsynchronousFileChannel,我希望在这个项目中尽可能快地写入文件。当我来测试我的项目时,我意识到可能读写操作对我来说不是真正异步的!我制作了一个非常简单的测试程序,通过将字节写入2个文件,每个文件对应一个磁盘,来查看写入和读取方法是否阻塞 ByteBuffer bufferc=ByteBuffer.allocate(75000000);//~75MB ByteBuffer bufferd=ByteBuffer.allocate(7500

我最近开始在我的一个项目中使用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);
这对我来说意味着写操作被“给予”executorService,并且程序继续运行。在这个程序的多次运行中,这种情况确实发生在我身上,但并不总是如此。我的意思是,我得到的输出像

start true true time=2621

或者如果我幸运的话

start false false time=235

时间真的不同,我甚至不明白为什么我会得到前两个输出!我希望有人向我解释影响此输出的因素,和/或我将如何获得上述输出中的第三个

我得到了像
start false false time=3
甚至
time=1
这样的计时,因为您没有等待写入完成,我不明白为什么要花费任何时间来开始写入。顺便说一句:您可以使用direct ByteBuffers,而不必填充缓冲区来发送它(它将充满零),您使用的是哪种Java 7?我使用的是Java HotSpot 7 update 3。我尝试了分配的缓冲区,没有填充它们,结果得到了true,true,time=1,但在我的情况下没有写入字节(尝试了futurec.get()),对我来说,这是因为我没有填充它们!老实说,我从来没有听说过java热点:S,我只知道我有JavaSE-1.7。。但我认为你不是这个意思!如果不填充它们,也不应该翻转()它们。
start false true time=3039
start false false time=235