web-dev-qa-db-ja.com

newCachedThreadPoolとnew​​FixedThreadPoolのどちらを使用するかを決定する方法は?

私は、各スレッドが特定の範囲で機能していることを確認する必要があるプロジェクトに取り組んでいます。例えば:

NO_OF_THREADS: 2
NO_OF_TASKS: 10

number of threads is 2およびnumber of tasks is 10の場合、各スレッドは10 tasksを実行します。つまり、2つのスレッドが20 tasksを実行するということです。

実際のシナリオでは、これらの数(タスクの数とスレッドの数)は両方とも私のコードで構成可能であるため、非常に高くなります。

上記の例では、first thread1 and 10の間にidを使用する必要があります。second thread11 and 20の間にidを使用する必要があります。その後、各スレッドはデータベース接続を確立し、データベースに挿入します。

だから私はうまく機能している私の以下のコードを持っています。

public static void main(String[] args) {

    final int noOfThreads = 2;
    final int noOfTasks = 10;

    //create thread pool with given size 
    ExecutorService service = Executors.newFixedThreadPool(noOfThreads);

    // queue some tasks 
    for (int i = 0, int nextId = 1; i < noOfThreads; i++, nextId += noOfTasks) {
        service.submit(new ThreadTask(nextId, noOfTasks));
    }
}

class ThreadTask implements Runnable {
    private final int id;
    private int noOfTasks;

    public ThreadTask(int nextId, int noOfTasks) {
        this.id = nextId;
        this.noOfTasks = noOfTasks;
    }

    public void run() {

    //make a database connection

        for (int i = id; i < id + noOfTasks; i++) {

        //insert into database
        }
    }
}

私の質問:-

私はインターネットでさまざまな記事を読んでいて、newCachedThreadPoolについて読みました。だから今私は疑問に思っています-コードでnewFixedThreadPoolまたはnewCachedThreadPoolを使用する必要がありますか?現在、私はnexFixedThreadPoolを使用しています。 newCachedThreadPoolまたはnewFixedThreadPoolを選択する必要がある要素を決定できません。これが、自分のコードで何をするかというシナリオを投稿した理由です。

誰かが私がここで何を選ぶべきか私を助けることができますか?そして、私がこれをよく理解できるように、なぜ私たちがそれをどのような要因で選んだのかを詳しく説明してください。私はすでにJavaのドキュメントを読んでいますが、ここで何を選択すべきかを決めることができません。

助けてくれてありがとう。

18
user1813228

だから今私は疑問に思っています-コードでnewFixedThreadPoolまたはnewCachedThreadPoolを使用する必要がありますか?

Javadocから引用すると、newFixedThreadPool()

固定数のスレッドを再利用するスレッドプールを作成します...

つまり、2つのスレッドを要求すると、2つのスレッドが開始され、3つは開始されません。一方、newCachedThreadPool()

必要に応じて新しいスレッドを作成するスレッドプールを作成しますが、以前に作成されたスレッドが利用可能になったときに再利用します。

あなたの場合、実行するスレッドが2つしかない場合は、プールに2つのジョブしか送信しないため、どちらも正常に機能します。ただし、20個のジョブすべてを一度に送信したいが、一度に2つのジョブしか実行しない場合は、newFixedThreadPool(2)を使用する必要があります。キャッシュされたプールを使用した場合、20個のジョブのそれぞれが同時に実行されるスレッドを開始しますが、CPUの数によっては最適ではない場合があります。

通常、現在実行中のすべてのスレッドがビジーであっても、needスレッドをすぐに生成する場合は、newCachedThreadPool()を使用します。最近、タイマータスクを生成するときに使用しました。同時ジョブの数は重要ではありません。これは、あまり多くのジョブを生成することはないためですが、要求されたときに実行し、休止状態のスレッドを再利用する必要があります。

パフォーマンスを最大化し、サーバーを圧倒しないように、任意の時点で実行される同時タスクの数を制限したい場合は、newFixedThreadPool()を使用しました。たとえば、ファイルから10万行を一度に1行ずつ処理している場合、各行で新しいスレッドを開始したくないが、ある程度の同時実行性が必要なので、たとえば10個の固定スレッドを割り当ててプールが使い果たされるまでタスク。

24
Gray