検索

ホームページ  >  に質問  >  本文

java - NIO非阻塞表现在什么地方?

都是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); 的时候岂不是也是阻塞的?

高洛峰高洛峰2768日前527

全員に返信(2)返信します

  • 怪我咯

    怪我咯2017-04-18 09:44:57

    読み取りイベントはサーバーのセレクターに登録され、I/O がブロックされている場合、クライアントはデータをブロック的に読み取るために read() メソッドを呼び出します。 NIO サーバーは、読み取りイベントを追加してデータを読み取ります。サーバーの処理スレッドは、セレクターにアクセスするときに興味深いイベントが到着したことが判明した場合、ポーリング方式でセレクターにアクセスし、興味深いイベントが到着しない場合、処理スレッドは関心のあるイベントが到着するまでブロックされます。

    詳細については、ここを参照してください:
    Java ブロッキング IO と非ブロッキング IO

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-18 09:44:57

    まず、ブロッキングと非ブロッキングの概念を理解する必要があります。ブロッキングとは、このスレッドが他のことを行うことができず、ここでのみ待機できることを意味します。ノンブロッキングとは、このスレッドが他のことを実行でき、常にここで待機する必要がないことを意味します。
    NIO のノンブロッキング原則について説明する前に、まず従来の IO について説明する必要があります。従来の IO はバイト単位で送信されます。つまり、一度に 1 バイトが送信されます。データ送信の効率を向上させるために、バッファ付き入出力モードが導入され、一度に大量のバイトを送信できるようになります。ただし、これにより、プログラムは読み取り (書き込み) バッファが空になるまで待機することになります。ストリームはいっぱいになるか閉じられるまで読み取り (書き込み) できません。これによりプログラムがブロックされ、プログラムの実行効率が低下します。 、

    返事
    0
  • キャンセル返事