2016-10-14 7 views
0

クライアントとのすべての通信を担当する1つのスレッドを持つことが「良い設計」と考えられているとよく聞きました。java-nio:選択とは別のスレッドから送信

しかし、クライアントリクエストを処理するために他のサーバーと通信する複数のスレッドがあります。

現在のデザインは、選択スレッドのために送信する応答をエンキューします。スレッドを選択すると、応答がデキューされ、適切なクライアントに送信されます。

これは愚かです。私は30のスレッドのようにクライアントに応答を送信する準備ができていると彼らはすべてそれらをエンキューし、スレッドを選択する1つずつそれらを送信させます。

閉じたシステムを想定すると、この制限をバイパスして、もともとクライアント要求を受け入れたスレッドと同じ(または同じではない場合)セレクタを持たないスレッドから送信する方法はありませんか?もしそうなら、どうですか?クローズドシステムを仮定

+0

通常、サーバは各クライアント自分のスレッド内であなたが何か他のことを聞いたら、私はそれが間違っているという噂として考えます。 – Heri

+2

@Heriそれはうわさではありません。明らかに、ノンブロッキング多重化I/Oを熱くすることは決してありません。これは疑問です。これは、Java 1.4の 'java.nio'パッケージで2002年頃に導入され、以前は何十年もの間、UnixやWindowsなどのオペレーティングシステムに組み込まれていました。ここに間違った情報を投稿しないでください。 – EJP

答えて

2

、安全にそのような制限はない

この制限を回避する方法はありません。好きなスレッドから送ることができます。

クライアント要求を最初に受け入れたスレッドと同じ(または同じではない場合)セレクタを持たないスレッドから送信しますか?もしそうなら、どうですか?

SocketChannel.write()を呼び出してください。セレクタスレッドへの書き込みをエンキューする必要があるのは、長さが短か長かったり、OP_WRITE、エンキューされたデータなどのチャネルを登録する必要がある場合です。

関連する問題