0

私には1つのスレッドがあり、唯一の仕事はソケットからDatagramPacketsを取得し、それらをバッファーに貼り付けることです。別のスレッドがそのバッファーを使用して動作し、DatagramPacketsを処理します。そのバッファで動作するスレッドのプールが欲しいのですが。

これを行うには、固定スレッドプールを使用することを考えていました。そのためには、プールを作成してから、実行するのに十分な実行可能ファイルを送信して、プールを埋める必要がありますか?「これはあなたに実行してほしいスレッド/実行可能ファイルです。これは私が実行したい数です、GO!」という言い方を望んでいました。これを行うそのような方法はありますか?固定スレッドプール以外のものの方が適していますか?

4

2 に答える 2

2

Executors.newFixedThreadPoolによって作成された固定スレッドプールは問題なく機能します。

実装の内部セマンティクスは、スレッドプールが、希望するサイズ(コアプールサイズ)に達するまで、新しいスレッドの作成を優先するようになっています。

于 2012-08-31T21:36:04.087 に答える
1

を使用する場合、プール内のスレッドによって順番に実行されるスレッドプールにジョブをExecutorService送信します。Runnable次のいずれかを実行できます。

  1. それぞれRunnableをループに入れ、ループ内からデキューしてBlockingQueue各パケットを処理します。それは、それらすべてがバッファオブジェクトの周りで同期するよりも簡単かもしれません。何かのようなもの:

    public void run() {
       while (!shutdown) {
          packet = packetQueue.take();
          processPacket(packet);
       }
    }
    
  2. または、オブジェクトの負荷が増える可能性がありますが、各パケットをジョブ自体としてスレッドプールに送信することもできます。各パケットを処理し、ペイロードを抽出し、ペイロードを処理するメソッドを使用Runnableしてペイロードのラッパーを作成できます。run()クラスの内容は次のRunnableようになります。

    Payload payload;
    public void run() {
       // process packet here
       processPayload(payload);
    }
    

どちらのメカニズムでも、プロセッサの数と処理タスクの性質に最も一致する固定スレッド番号を選択します。以下の例では、プロセッサの数を使用していますが、GCまたはその他のタスクのためにいくつかのプロセッサを削除することをお勧めします。処理が他のIOでブロックされる場合に備えて、さらに多くの情報を追加することをお勧めします。パフォーマンステストだけが、そこに最適な値が何であるかを教えてくれます。

// start a pool that uses the number of threads that there are processors
ExecutorService threadPool = Executors.newFixedThreadPool(
    Runtime.getRuntime().availableProcessors());
于 2012-08-31T21:36:33.700 に答える