2

スレッドプールの使用を練習し始めたところです。私は Java でサーバー クライアント バンク アプリを作成しています。Oracle のドキュメントをいくつか読んで、キャッシュされたスレッド プールを使用することを考えています。しかし、いくつかのカウント テストを実行したところ、固定スレッド プールの方が高速であることがわかりました。キャッシュされたスレッド プールが遅延し、不要なスレッドが大量に作成されたようです。(または、ここで何か間違ったことをしているかもしれません)。

私の質問は、実際の状況では、どちらがより効率的でしょうか? または、より効率的な別のタイプのプールがあります。

また、私のカウントテストでは、いくつかの行があります:

ExecutorService executor = Executors.newCachedThreadPool();

    for (int i = 0; i < 500; i++) {
          Runnable worker = new serv(10000000L + i);
          executor.execute(worker);
    }

上記の行で、使用されていないスレッドは (新しいスレッドを作成する代わりに) 自動的に再利用されますか?それとも、これが確実に行われるようにするために何か追加する必要がありますか?

4

2 に答える 2

1

私は遅れました、あなたはすでに別の答えを受け入れましたが、これが私の見解です:

newCachedThreadPool()自分が何をしているのかわからない限り、使用することはお勧めしません。その理由は、サブミットされたタスクを実行するために必要な数のスレッドを作成するためです。これにより、記述子が不足したり、作成されたスレッドが多すぎるために JVM がクラッシュしたりするなど、望ましくない状況が発生する可能性がありました。ただし、アイドル状態のスレッドは 60 秒後にプールから削除されますが、それでも無制限に増加します。

質問に戻ります:

上記の行で、使用されていないスレッドは (新しいスレッドを作成する代わりに) 自動的に再利用されますか?それとも、これが確実に行われるようにするために何か追加する必要がありますか?

場合によります。Runnable workerそれぞれが完了するまでに長い時間がかかるとしましょう(例: 2 分)。したがって、ループ内に 5​​00 個のスレッドを作成することになります。すべてのタスクが完了すると、これらの 500 スレッドはメモリに 60 秒間残り、その後要求されます。

スレッドを再利用する場合は、「Executors.newFixedThreadPool(...)」を使用して、使用するスレッドの数を指定します。スレッドよりも多くのタスクを送信すると、タスクはスレッドが使用可能になるまでキューで待機します。

于 2013-05-12T04:49:57.147 に答える