Maison  >  Questions et réponses  >  le corps du texte

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

高洛峰高洛峰2719 Il y a quelques jours500

répondre à tous(2)je répondrai

  • 怪我咯

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

    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

    répondre
    0
  • 天蓬老师

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

    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. ,

    répondre
    0
  • Annulerrépondre