複数のクライアントにサービスを提供するある種のサービスを実装すると仮定しましょう。I/O 操作 (ファイル アクセス、ネットワーク通信など) である程度の並列処理を実現する必要があります。そうしないと、1 つのクライアントが他のクライアントをブロックする可能性があります。次の 2 つのオプションがあります。
複数のスレッドを生成でき、各スレッドはブロッキング I/O 操作を使用します。
シングル スレッド (またはごく少数) を使用し、ノンブロッキング I/O 操作を使用します。
ノンブロッキング I/O を使用したソリューションの実装は、各クライアントのコンテキストを自分で管理する必要があるため、通常ははるかに困難です。クライアントごとに専用のスレッドを使用すると、当然コンテキストが与えられます (スレッド コンテキスト = クライアント コンテキスト)。
非ブロッキング I/O は、少数のスレッドで処理できるため、低速のクライアントが多数ある場合、追加の実装作業を行う価値があります。クライアントごとにスレッドを使用すると、スレッドは主にそこに座って待機し、大量のメモリを使用します。
サービスを実装するのではなく単純なアプリケーションを実装する場合、ノンブロッキング I/O は確かに価値がありません。
更新: ユース ケースを正しく理解していれば、Web ページを Web クライアントに提供するだけでなく、Web クライアントにサービスを提供するために REST 要求を実行する必要がある Web アプリケーションがあります。したがって、非常に多数の同時クライアント (数千以上) があり、REST 要求に長い時間 (数秒) かかる場合は、ノンブロッキング I/O が理にかなっている可能性があります。ただし、Web サーバーは非同期操作をサポートする必要があるため、REST 要求が完了するまでスレッドをサーバーに戻すことができます。非同期操作は、Servlert 3.0 仕様で導入されました。そのため、Tomcat 7 のような最新の Web サーバーが必要になります。