2

誰もがJavaIOがブロッキングであり、javaNIOがブロッキングであることを知っています。IOでは、クライアントパターンごとにスレッドを使用する必要があります。NIOでは、すべてのクライアントに1つのスレッドを使用できます。

ここで私の質問は次のとおりです。JavaIOAPIのみを使用してノンブロッキングデザインを作成することは可能ですか。(NIOではありません)

私はこのようなパターンについて考えていました(明らかに非常に単純化されています)。

        List<Socket> li;
        for (Socket s : li) {
            InputStream in = s.getInputStream();
            byte[] data = in.available();
            in.read(data);
            // processData(data); (decoding packets, encoding outgoing packets
        }

また、クライアントは常にデータを読み取る準備ができていることに注意してください。

これについてどう思いますか?これは、パフォーマンスに大きな問題がなく、少なくとも数百のクライアントを保持する必要があるサーバーに適していますか?

4

1 に答える 1

5

可能ですが無意味です。java.net には select() がないため、ソケットのポーリングに削減されます。これは、ポーリング間でスリープすることを意味し、スリープする時間がわからないため、必要以上に長くスリープすることになります。時間を浪費し、待ち時間を追加するなど。そうしないと、愚かなほど短い間隔でスリープする必要があり、無意味な CPU を消費します。

わずか数百のクライアントの場合、従来の接続ごとのスレッドの使用に異論はありません。

「クライアントは常にデータを読み取る準備ができている」という意味がわかりません。サーバーからそれを知ることはできません。サーバーの準備ができていない場合、サーバーへの書き込みがブロックされる可能性があり、Applecard が完全に混乱します。

于 2012-12-04T22:18:29.290 に答える