私はJavaコードをNIOを使用するように変換している最中ですが、それを設計するための最良の方法がわかりません。
私の最初のアプローチは、セレクタースレッドのプールを作成することでした。スレッドは必要に応じて開始/強制終了され、チャネルはラウンドロビン方式で接続/受け入れられるとセレクタースレッドに登録されます。そこから、各スレッドはselect()でブロックし、ウェイクアップすると、選択されたキーを持つ各チャネルに関連付けられた適切なコールバックを実行します。
この「複数のセレクタースレッド」の設計に加えて、単一のセレクタースレッドとディスパッチスレッドのプールを使用すると言われることもあります。IO操作を実行する準備ができると、セレクターはディスパッチャースレッドに通知し、ディスパッチャースレッドはリクエストを処理します。このモデルには、IOスレッドをブロックしないという利点がありますが、現在、すべてのIOを単一のスレッドに強制し、ディスパッチャーで同期/イベントキューを処理しています。
さらに、各チャネルを読み取るために単一の直接バイトバッファを使用して、それをコールバックに直接渡すことはできません。代わりに、読み取りが発生するたびにデータを配列にコピーしてリセットする必要があります。(おもう..)
これを実装するための最良の方法は何ですか?