Fragen zu Java NIO

Mortal_Shadow

Aktives Mitglied
Hi,

ich versuche mich gerade das ganze etwas zu nutzen.
Dabei stoße ich hauptsächlich auf zwei Fragen:
1) Beim Server:
Ich registriere meine Clients bei einem Selektor mittels
[Java]client.register(selector, SelectionKey.OP_READ & SelectionKey.OP_WRITE);[/Java]
In einer Schleife wird nun halt immer wieder Selector.select() aufgerufen.

Problem bei der ganzen Sache sehe ich darin, dass wenn im Moment gerade nichts zu senden/lesen ist, der Selector mir trotzdem immer wieder alle Clients liefert, da diese ja schreibbereit sind.
Ich rattere also in einem fort durch meine while-Schleife ohne etwas zu tun und verbrauche nur unnötig Rechenkapazität.
Gibt es dafür irgendeine Lösung?

2)Beim Client:
Eher eine Stilfrage meiner Meinung nach - dennoch: wie würdet ihrs machen.
Den SocketChannel des Clients als "blocking" und zwei Threads: einer zum lesen, einer zum schreiben oder "non-blocking" und ein Thread zum lesen und schreiben.
Ich tendiere zu ersterem, da letze Lösung das gleiche Problem hat, dass ich bezüglich des Servers angesprochen hat (sofern es dafür keine Lösung gibt).
 
Gut erkannt!

Deswegen wird ein Channel immer nur DANN auf OP_WRITE gesetzt, wenn was da ist. Also bastele dir eine WriteREquestQueue oder ähnliches.. Wenn die nicht leer ist, wird VOR dem nächsten Aufruf von select() schnell der Channel auf OP_WRITE gesetzt. Nachdem alles geschrieben wurde, gehts wieder nur auf OP_READ.

Hier: Rox Java NIO Tutorial

Gutes Beispiel! Wenn du allse durch hast, verstehst du, was ich meine 😉

EDIT:

Generell ist das egal, denn wenn ein Channel writable ist, blockiert write() nicht und wenn ein Channel readable() ist, blockiert ein Channel nicht bei read(). Natürlich kannst du die Performance erheblich steigern, wenn du einen Threadpool für alle Channels benutzt!
Sprich einen Pool mit sovielen Threads, wie es physikalische CPUs gibt (Runtime.getRuntime().availableProcessors()).

Arbeite den Artikel durch, den ich dir weiteroben gegeben habe, danach verfliegen bestimmt die meisten Fragen 😉

Gruß,

Chris
 
Zuletzt bearbeitet:
Ja, das war sicher hilfreich.
Gut war auf jeden der Hinweis, nicht von einem anderen Thread die ops des Selectors zu ändern.
(Besonders verführerisch halt, es mit dem Thread zu tun, der mir die Daten zum schreiben sendet.)

Ein Hinweis jedoch noch dazu:
Laut diesem Thread stimmt das Deadlock bei (OP_Read | OP_WRITE) zumindest nicht.
(Man kann sie also zusammen nutzen - was ich tun werde - wenn es Probleme geben schau ich da halt als erstes nach)

Danke.
 

Zurück
Oben