2016-07-13 6 views
3

Tout récemment, j'ai appris à propos de NIO. Ce que j'ai compris, c'est que le principal avantage de NIO est que nous pouvons gérer de nombreuses connexions avec seulement un (ou peu) de threads grâce à la fonctionnalité non bloquante de NIO. Mais ne pouvons-nous pas atteindre cet objectif en utilisant Executors et avoir une liste de threads de travail?Pourquoi devrais-je utiliser NIO (ou des frameworks comme netty) au lieu des exécutants java?

Je ne vois aucun avantage de NIO sur les Executors. Au lieu de cela, je pense que les exécuteurs sont meilleurs qu'utiliser NIO comme la lecture des messages est très facile et nous avons seulement besoin d'appeler readLin() par exemple, mais dans NIO nous devrions vérifier si le message est partiel ou le tampon a plusieurs messages. La fonctionnalité de non-blocage existe aussi dans l'âme des exécuteurs, où nous appelons la fonction d'exécution d'un exécuteur, nous ajoutons fondamentalement la connexion à un tampon et attendons que le nombre fixe de thread soit libre. Alors, pourquoi quelqu'un utiliserait-il NIO au lieu d'utiliser des exécuteurs?

Merci

+1

Vous ne pouvez pas gérer plusieurs prises de blocage dans un seul fil. Se cacher derrière un «Exécuteur» ne change pas cela. – EJP

+0

Si j'appelle la méthode d'exécution de l'exécuteur pour chaque socket reçue et que j'ai un exécuteur avec un seul thread, ce thread gère ces socket un par un. Ai-je tort? –

+0

Oui. Vous allez bloquer dans la première lecture que vous émettez. – EJP

Répondre

0

multi-threading est aussi rapide que (ou encore plus vite que) NIO jusqu'à ce que vous rencontrez le problème d'évolutivité. Trop de threads rend la performance inférieure à NIO.

Mais dans certains cas, il a été dit que le blocage IO multi-threading est encore mieux que NIO: http://paultyma.blogspot.com/2008/03/writing-java-multithreaded-servers.html

+0

Ce n'est pas ce qu'il a demandé. Il a demandé à propos de NIO par rapport à un exécuteur avec un nombre fixe de threads, et dans ses commentaires, il a étrangement utilisé une taille fixe de 1. – EJP

+0

Vous avez raison de son propos. Pour le titre de sa question, je pense que c'est toujours pertinent. Merci pour vos commentaires et laissez-moi préciser que je parle de créer un fil par connexion ici. –