2016-07-13 31 views
3

Erst kürzlich habe ich von NIO erfahren. Was ich verstanden habe, ist, dass der Hauptvorteil von NIO ist, dass wir viele Verbindungen mit nur einem (oder wenigen) Threads verarbeiten können, dank der nicht-blockierenden Funktion von NIO. Können wir dieses Ziel nicht mithilfe von Executors und einer Liste von Worker-Threads erreichen?Warum sollte ich NIO (oder Frameworks wie Netty) anstelle von Java-Executoren verwenden?

Ich kann keinen Vorteil von NIO gegenüber Executors sehen. Stattdessen denke ich, dass Executoren besser sind als die Verwendung von NIO, da das Lesen von Nachrichten sehr einfach ist und wir zum Beispiel nur readLin() aufrufen müssen, aber in NIO sollten wir prüfen, ob die Nachricht unvollständig ist oder der Puffer mehrere Nachrichten hat.

Die Eigenschaft des Nicht-Blockierens existiert auch in der Seele von Executoren, wo wir Execute-Funktion eines Executors aufrufen, wir fügen im Grunde die Verbindung zu einem Puffer hinzu und warten, bis die feste Thread-Nummer frei ist.

Also, warum sollte jemand NIO anstelle von Executoren verwenden?

Dank

+1

Sie nicht mehrere Buchsensperre in einem einzigen Thread verarbeiten kann. Sich hinter einem "Executor" zu verstecken, ändert das nicht. – EJP

+0

Wenn ich Execute-Methode des Executor für jedes Socket aufgerufen und einen Executor mit nur einem Thread haben, behandelt dieser Thread diese Sockets einzeln. Liege ich falsch? –

+0

Ja. Sie werden in der ersten Lese blockieren Sie Problem. – EJP

Antwort

0

Multi-Threading ist so schnell wie (oder sogar als schneller) NIO, bis Sie die Skalierbarkeit Problem auftritt. Zu viele Threads machen die Leistung niedriger als NIO.

Aber in einigen Fällen hieß es, dass Multi-Threading Blockierung IO als NIO noch besser ist: http://paultyma.blogspot.com/2008/03/writing-java-multithreaded-servers.html

+0

Das ist eigentlich nicht das, wonach er gefragt hat. Er fragte nach NIO gegen einen Executor mit einer festen Anzahl von Threads, und in seinen Kommentaren verwendete er seltsamerweise eine feste Größe von 1. – EJP

+0

Sie haben Recht, wenn Sie seinen Vorschlag berücksichtigen. Für den Titel seiner Frage halte ich es aber trotzdem für relevant. Danke für deine Kommentare und lass mich klarstellen, dass ich hier über das Erstellen eines Threads pro Verbindung rede. –