0

共通の workQueue である adPoolExecution アーキテクチャでは、ジョブが到着すると、スレッドが 1 つだけ呼び出され、そのスレッドが作業を完了します。代わりに、すべてのスレッドが呼び出され、すべてのスレッドがタスクを実行するようにします。

私のシナリオは以下の通りです。5000 個のデータ項目があり、各データ項目に対してタスクを実行する必要があります。1つずつ実行すると遅いことが判明したため、ここでスレッドを使用したいと思います。ここで、5 つのスレッドを使用したとします。最初のスレッドは最初の 1000 個のデータ項目を実行し、2 番目のスレッドは次の 1000 個を実行し、他のスレッドが続きます。この 5000 個のデータ項目に対して実行する必要があるジョブが到着すると、タスクを実行できるように、5 つのスレッドすべてを呼び出すか、スリープ状態から戻す必要があります。

これは、Java で adPoolExecution を使用してどのように可能ですか。同じジョブの 5 つのコピーをキューに挿入すると役立つ場合があることは承知しています。しかし、これには多くの副作用があります。たとえば、スレッドがその仕事をすぐに完了した場合、他の誰かの仕事を占有してしまいます。

ありがとう

4

2 に答える 2

1

最初のスレッドで最初の 1000 個のアイテムを処理し、2 番目のスレッドでさらに 1000 個のアイテムを処理する必要があるため、これはスレッドに異なるタスクを実行させることを意味します。対照的に、すべてのスレッドが同じタスクを実行する場合、これはすべてのスレッドが同じデータ項目を実行することを意味します (これは役に立たず、スレッドが結果を同じ場所に保存するときに問題を引き起こす可能性があります)。

ですから、「同じジョブを 5 部挿入する」ことはしないでください。異なるデータ範囲で、異なるタスクを送信します。

    for (int k=0; k<N; k+=1000) {
       final int datapoint=k;
       executor.execute(new Runnable() {
           processDataRange(datapoint, datapoint+1000);
       });
    }

ここでは、ループの各パスで、異なるパラメーターを持つ新しいタスクが作成され、エグゼキューターに送信されます。

于 2012-11-24T04:16:26.730 に答える
0

この例ではカウント 5 でCountDownLatchを使用できるため、すべてのスレッドがそれぞれcountDownの を呼び出した後に必要なことを行うことができます。

于 2012-11-23T03:49:05.663 に答える