java - NIO非阻塞表现在什么地方?
高洛峰
高洛峰 2017-04-18 09:42:57
0
2
524

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(2)
刘奇

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

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

いいねを押す +0
Peter_Zhu

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート