私は、アプリケーションの反対側の外部システムに接続して登録したクライアントを表すクラスのオブジェクトをインスタンス化するJavaアプリケーションを作成しています。Java - 非ブロッキングソケット用の複数スレッドの複数のセレクタ
各クライアントオブジェクトには、フロントエンドとバックエンドを表す2つのネストされたクラスがあります。フロントエンドクラスは実際のクライアントから継続的にデータを受信し、フロントエンドからそのデータを受け取り、適切なフォーマットとプロトコルを使用して外部システムに送信するバックエンドクラスに指示とデータを送信しますそのシステムに必要です。
この設計では、クライアントオブジェクトの各インスタンス化をスレッドにすることを検討しています。次に、各スレッド内には当然ながら、それぞれ独自のNIOチャネル[EDIT]を持つ2つのソケット[EDIT]があり、クライアント側とシステム側はそれぞれフロントエンドとバックエンドに存在します。しかし、これにより、非ブロッキングソケットが必要になりました。私はチュートリアルhereを読んでいます。このチュートリアルでは、メインスレッドでセレクタを安全に使用して、接続されたすべてのスレッドを処理する方法について説明しています。
しかし、私が必要とするのは、複数のセレクタで、それぞれは独自のスレッドで動作します。前述のチュートリアルを読んで、Selectorのキーセットがスレッドセーフではないことを知りました。これは、ソケットとチャンネルのペアをそれぞれ持たせようとすると、自己のrepsectiveスレッドでインスタンス化された別のセレクタが競合するキーを作成する可能性があることを意味しますか?セレクタをメインスレッドに移動することはわずかな可能性がありますが、私が与えたソフトウェア要件に基づいて理想からは遠く離れています。ご協力ありがとうございました。
私はちょっとあなたの答えで混乱しています。あなたは、チャンネル自体がスレッドであり、チャンネルが独自のスレッドであると言っていますか、別のチャンネルクライアントからのスレッド? 私のオリジナル投稿では、各クライアントオブジェクトに2つのソケットと、アプリケーションの両側で通信する2つのチャネルがあるはずです。ノンブロッキングとノンブロッキングの概念に精通しており、多重通信の要件のために非ブロッキングを特に選択しました。 –
これはうんざりしています。 :http://www.ibm.com/developerworks/aix/library/au-pollset/index.htmlより良い答えが得られます。 Threading thingamabob:これは、良いioとスレッドのパフォーマンスを望むプログラミングコンテキストで動作するように設計されています。全体の問題は、Real-Time JSRに記述されている問題によって深刻に混乱しています。上記のリンクは、問題についての情報が提供されているエンジニアによる問題の議論を行います。私は早期にテストをしましたが、そうではありません。 –