18

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

NO_OF_THREADS: 2
NO_OF_TASKS: 10

If number of threads is 2and number of tasks is 10then 各スレッドが実行され10 tasksます。つまり、2 つのスレッドが実行され20 tasksます。

実際のシナリオでは、これらの数 (タスクの数とスレッドの数) は非常に高くなります。どちらも私のコードで構成できるからです。

上記の例では、 first threadid between1 and 10を使用する必要があり、さらにスレッドがあれば、second threadid between を使用する必要があります。11 and 20その後、各スレッドはデータベース接続を確立し、データベースに挿入します。

だから私は正常に動作している以下のコードを持っています。

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。だから今、私は疑問に思っています-コードでnewFixedThreadPoolorを使用する必要がありますか? newCachedThreadPool現在、私は使用していnexFixedThreadPoolます。どの要因を選択すればよいかnewCachedThreadPool、またはを決定できませんnewFixedThreadPool。それが、自分のコードで何をしようとしているかというシナリオを投稿した理由です。

ここで何を選択すればよいか、誰か助けてもらえますか? そして、私がこれをよく理解できるように、どのような要因でそれを選択するのかを詳細に説明してください. 私はすでに Java ドキュメントを調べましたが、ここで何を選択すればよいか判断できません。

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

4

2 に答える 2

25

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

Javadocs から引用すると、次のようになりnewFixedThreadPool()ます。

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

これは、2 つのスレッドを要求すると、2 つのスレッドが開始され、3 つは開始されないことを意味しますnewCachedThreadPool()

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

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

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

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

于 2013-02-25T01:58:19.930 に答える