1000 のバッチでコードを実行するメソッドをマルチスレッド化する必要があります。これらのバッチを別のスレッドに渡す必要があります。
現在、私は 3 つのスレッドを生成していますが、3 つすべてが 1000 の最初のバッチを選択しています。他のバッチが同じバッチを選択するのではなく、他のバッチを選択する必要があります。
助けて提案をしてください。
1000 のバッチでコードを実行するメソッドをマルチスレッド化する必要があります。これらのバッチを別のスレッドに渡す必要があります。
現在、私は 3 つのスレッドを生成していますが、3 つすべてが 1000 の最初のバッチを選択しています。他のバッチが同じバッチを選択するのではなく、他のバッチを選択する必要があります。
助けて提案をしてください。
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();
バッチ内のジョブのリストへのアクセスを同期する必要があります。(「同期」とは、本質的に「スレッドが潜在的な競合状態を認識していることを確認する」ことを意味します。ほとんどのシナリオでは、これは「一度に 1 つのスレッドでいくつかのメソッドを実行させる」ことを意味します。)
これは、java.util.concurrent
パッケージを使用して最も簡単に解決できます。BlockingQueue
たとえばArrayBlockingQueue
やのさまざまな実装を見てみましょうLinkedBlockingQueue
。
バッチを に入れ、BlockingQueue
ワーカー スレッドがキューからバッチを取得するようにします。
バッチを取得するときは、lock
またはを使用します。mutex
こうすることで、複数のスレッドが同時にクリティカル セクションにアクセスしたり、誤って同じバッチにアクセスしたりすることがなくなります。
スレッドによって選択されたバッチを削除していると仮定しています。
編集: aioobe と jonas の回答の方が優れています。それを使用してください。これは代替手段です。:)