0

Thread Pool Executor は、Future Task に多数のスレッドを使用します。run() または call() が戻るまで、少なくとも 1 つのスレッドを割り当てます。

そのため、JAVA NIO HTTP リクエストにスレッド プールを使用する方法について混乱しています。

1) イベントループを実行するスレッド

2) スレッドは IO でブロックされないため、run/call メソッドを終了します。次に、ハンドラーの呼び出しを担当するのは誰ですか。

私の質問は、Java NIO ベースの HTTP POST クライアント リクエストをスレッド プールで使用する方法です (作成する必要がある HTTP リクエストの数が多いため)。スレッドは決してスリープしません (ブロックするものがないため、常に実行されます)

4

1 に答える 1

2

さて、これが哲学です。マルチスレッドは 2 つのフレーバーで使用できます (それ以上の場合もありますが、この場合は重要ではありません)。従来のマルチスレッドでは、スレッドとブロッキング I/O を使用します。タスクグレイン マルチスレッド (より適切な用語を提案してください) は、従来のマルチスレッドに基づいて構築されており、次の制限を利用しています。

  • タイプのタスクはRunnable作業単位です。
  • タスクがブロックされない可能性があります。
  • タスクが長いイベント (I/O の終了や時間間隔など) を待ちたい場合は、別のタスクを準備し、イベント後に実行するように調整して終了します (から戻るRunnable.run())。

タスクは、実行のためにスレッド プールに送信されます。

非同期 I/O は、タスク指向モデルに完全に適合します。フューチャーは、スレッド指向プログラミング スタイルとタスク指向プログラミング スタイルの間の接着剤です。タスクからスレッドに情報を渡すために使用できますが、タスクがブロックされない可能性があるため、逆方向には使用できません。したがって、完全に非同期のサーバーを設計するときは、Future をまったく使用する必要はありません。

NIO1 にはセレクター スレッドが必要です。スレッド プールとは別に作成して実行します。NIO2 (java7) はセレクター スレッドを必要としません (ユーザーが煩わされないようにバックグラウンドで維持します)。

NIO サーバーの例を見つけるのは簡単です。df4jには、NIO1 と NIO2 の両方のエコー サーバー (http サーバーではない) の例があります。

于 2013-05-16T07:34:33.383 に答える