私は最近、私のプロジェクトで Java AsynchronousFileChannel を使い始めました。ここでは、ファイルにできるだけ早く書き込みたいと考えています。私が自分のプロジェクトをテストするようになったとき、実際には非同期ではない読み取り操作と書き込み操作があることに気付きました! ディスクごとに1つずつ、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);
したがって、2 つのバッファーを 2 つの異なるファイルに書き込みます。各バッファは約 75 MB であるため、各バッファをすぐにディスクに書き込むことはできないと思います。そのため、次のような出力が期待されます。
false false time=
これは、書き込み操作が executorService に「与えられ」、プログラムが引き続き実行されることを意味します。このプログラムを複数回実行すると、これが発生しますが、常にではありません。つまり、次のような出力が得られます
start true true time=2621
また
start false true time=3039
または運が良ければ
start false false time=235
時間は本当に異なり、なぜ最初の 2 つの出力が得られるのかさえ理解できません! この出力に影響を与える要因、および/または上記の出力の3番目のみを取得する方法を誰かに説明してもらいたいです!