Ich bin dabei, unseren Java-Code in Verwendung von NIO umzuwandeln, aber ich bin mir nicht sicher, wie ich es am besten gestalten soll.
Mein erster Ansatz war es, einen Pool von Selektorthreads zu erstellen. Die Threads werden bei Bedarf gestartet/beendet, und Kanäle werden in einer Round-Robin-Reihenfolge einem Selektorthread zugewiesen, wenn sie verbunden/akzeptiert werden. Von dort aus blockiert jeder Thread bei select(), und wenn er geweckt wird, wird der entsprechende Callback für jeden Kanal ausgeführt, der einen ausgewählten Schlüssel hat.
Zusätzlich zu diesem Design mit "mehreren Selektorthreads" habe ich auch gesehen, dass man vorschlägt, einen einzelnen Selektorthread und einen Pool von Dispatch-Threads zu verwenden. Wenn ein IO-Vorgang bereit ist, ausgeführt zu werden, benachrichtigt der Selektor einen Dispatcher-Thread, der dann die Anfrage verarbeitet. Dieses Modell hat den Vorteil, dass der IO-Thread nicht blockiert wird, aber nun zwingen wir alle IOs in einen einzigen Thread und müssen mit Synchronisierung/einer Ereignisschlange im Dispatcher umgehen.
Zusätzlich könnte ich auch kein einzelnes direktes Byten-Buffer für das Lesen jedes Kanals verwenden und es direkt an den Callback übergeben. Stattdessen müsste ich die Daten jedes Mal, wenn ein Lesevorgang erfolgt, in ein Array kopieren und zurücksetzen. (Glaube ich..)
Was ist der beste Weg, um dies zu implementieren?