都是NIO是面向缓冲区的非阻塞的io,面向缓冲区倒是好理解,非阻塞到底体现在什么地方?莫不是selector使得NIO是非阻塞的?像下面代码:
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buf);
while (bytesRead != -1) {
System.out.println("Read " + bytesRead);
buf.flip();
while(buf.hasRemaining()){
System.out.print((char) buf.get());
}
buf.clear();
bytesRead = inChannel.read(buf);
}
aFile.close();
在int bytesRead = inChannel.read(buf);
的时候岂不是也是阻塞的?
読み取りイベントはサーバーのセレクターに登録され、I/O がブロックされている場合、クライアントはデータをブロック的に読み取るために read() メソッドを呼び出します。 NIO サーバーは、読み取りイベントを追加してデータを読み取ります。サーバーの処理スレッドは、セレクターにアクセスするときに興味深いイベントが到着したことが判明した場合、ポーリング方式でセレクターにアクセスし、興味深いイベントが到着しない場合、処理スレッドは関心のあるイベントが到着するまでブロックされます。
詳細については、ここを参照してください:
Java ブロッキング IO と非ブロッキング IO
まず、ブロッキングと非ブロッキングの概念を理解する必要があります。ブロッキングとは、このスレッドが他のことを行うことができず、ここでのみ待機できることを意味します。ノンブロッキングとは、このスレッドが他のことを実行でき、常にここで待機する必要がないことを意味します。
NIO のノンブロッキング原則について説明する前に、まず従来の IO について説明する必要があります。従来の IO はバイト単位で送信されます。つまり、一度に 1 バイトが送信されます。データ送信の効率を向上させるために、バッファ付き入出力モードが導入され、一度に大量のバイトを送信できるようになります。ただし、これにより、プログラムは読み取り (書き込み) バッファが空になるまで待機することになります。ストリームはいっぱいになるか閉じられるまで読み取り (書き込み) できません。これによりプログラムがブロックされ、プログラムの実行効率が低下します。 、