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

都是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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous(2)
刘奇

L'événement read est enregistré sur le sélecteur du serveur. A un certain moment, le client envoie des données au serveur, bloquant les E/S. A ce moment, la méthode read() sera appelée pour lire les données. de manière bloquante, et le serveur NIO lira les données dans le sélecteur Ajouter un événement de lecture. Le thread de traitement du serveur accédera au sélecteur par interrogation. S'il constate que des événements intéressants arrivent lors de l'accès au sélecteur, ces événements seront traités. Si aucun événement intéressant n'arrive, le thread de traitement se bloquera jusqu'à ce que les événements intéressants arrivent.

Vous pouvez voir ici pour plus de détails :
Java bloquant les IO et les IO non bloquantes

Peter_Zhu

Tout d'abord, vous devez connaître les concepts de blocage et de non-blocage, ce qui signifie que ce fil ne peut rien faire d'autre et ne peut qu'attendre ici. Non bloquant signifie que ce fil peut faire autre chose et n'a pas besoin d'attendre ici tout le temps.
Avant de parler du principe non bloquant de NIO, nous devons d'abord parler de l'io traditionnel. Les E/S traditionnelles sont transmises par octets, c'est-à-dire qu'un octet est transmis à la fois. Afin d'améliorer l'efficacité de la transmission des données, le mode d'entrée et de sortie avec tampon est introduit, de sorte qu'un grand nombre d'octets puissent être transmis à chaque fois. Cependant, cela obligera le programme à attendre que le tampon de lecture (écriture) soit terminé. pas plein. Le flux ne peut pas être lu (écrit) tant qu'il n'est pas plein ou fermé. Cela provoque le blocage du programme et réduit l'efficacité de son exécution. ,

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!