AsynchronousFileChannel写操作,有时会阻塞?

时间:2012-04-12 11:14:14

标签: java

我最近开始将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项!

0 个答案:

没有答案