Ich schreibe eine einfache Server-Client-Anwendung mit Java NIO, die die Reactor Pattern
angewendet. zu meinem Verständnis ist die Reactor
Klasse verantwortlich zu sammeln Events
(wie: OP_ACCEPT, OP_READ, OP_WRITE).Dispatch Event Handler in separaten Threads im Reaktormuster
Der relative EventHandler
würde für die spezifische Aufgabe verantwortlich sein, so denke ich, dass Handler asynchron in separaten Threads ausgeführt werden sollten.
, wenn ich dies ausführen, zeigt es einige Probleme, die while-Schleife laufen zu halten, und die Selector
hält readyOps Satz (1,4,16) zurückzukehren. Ich denke, es ist, weil die AcceptHanndler
nicht die OP_ACCEPT
in der blockierenden Weise behandelt, so dass der Schlüssel im Iterator entfernt wird, nach einem select()
, würde es wieder auftauchen. Also sollte ich den eventHander nicht als ausführbar betrachten?
Das Konzept der edge-triggered
und level-triggered
Modelle kommt mir in den Sinn ... ist der Grund, weil der Selektor läuft in level-triggered
Modell?
Der ganze Sinn von Selektoren ist, dass Sie * keine * separaten Threads verwenden müssen. – EJP
Der Punkt von 'Selector' ist, mehrere Sockets in einem Thread zu verwalten, ich habe kein Thread pro Client verwendet. – JasonHuang
Sie tun viel schlimmer als das. Sie verwenden grundsätzlich einen Thread * pro Selektor-Ereignis *. Sie sollten die Handler im aktuellen Thread ausführen und nur Hilfsthreads für lang andauernde Ereignisse wie Datenbankzugriffe verwenden, * nachdem * Sie das Akzeptieren oder Lesen abgeschlossen haben oder wo auch immer sich das Ereignis im aktuellen Thread befand. Ihr Grundmodell ist kaputt. – EJP