2

1000 のバッチでコードを実行するメソッドをマルチスレッド化する必要があります。これらのバッチを別のスレッドに渡す必要があります。

現在、私は 3 つのスレッドを生成していますが、3 つすべてが 1000 の最初のバッチを選択しています。他のバッチが同じバッチを選択するのではなく、他のバッチを選択する必要があります。

助けて提案をしてください。

4

4 に答える 4

9

ExecutorServiceを使用します

int numberOfTasks = ....
int batchSize = 1000;
ExecutorService es = Executors.newFixedThreadPool(3);
for (int i = 0; i < numberOfTasks; i += batchSize) {
    final int start = i;
    final int last = Math.min(i + batchSize, numberOfTasks);
    es.submit(new Runnable() {
        @Override
        public void run() {
            for (int j = start; j < last; j++)
                System.out.println(j); // do something with j
        }
    });
}
es.shutdown();
于 2011-11-01T12:51:14.167 に答える
3

バッチ内のジョブのリストへのアクセスを同期する必要があります。(「同期」とは、本質的に「スレッドが潜在的な競合状態を認識していることを確認する」ことを意味します。ほとんどのシナリオでは、これは「一度に 1 つのスレッドでいくつかのメソッドを実行させる」ことを意味します。)

これは、java.util.concurrentパッケージを使用して最も簡単に解決できます。BlockingQueueたとえばArrayBlockingQueueやのさまざまな実装を見てみましょうLinkedBlockingQueue

于 2011-11-01T12:41:37.053 に答える
3

バッチを に入れ、BlockingQueueワーカー スレッドがキューからバッチを取得するようにします。

于 2011-11-01T12:42:01.310 に答える
3

バッチを取得するときは、lockまたはを使用します。mutexこうすることで、複数のスレッドが同時にクリティカル セクションにアクセスしたり、誤って同じバッチにアクセスしたりすることがなくなります。

スレッドによって選択されたバッチを削除していると仮定しています。

編集: aioobe と jonas の回答の方が優れています。それを使用してください。これは代替手段です。:)

于 2011-11-01T12:42:30.500 に答える