我必须多线程运行1000批次代码的方法。我需要将这些批次分配给不同的线程。
目前我已经产生了3个线程但是所有3个线程都在挑选第一批1000个线程。 我希望其他批次不应该选择相同的批次而是选择另一批次。
请帮助并提出建议。
答案 0 :(得分: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();
答案 1 :(得分:3)
您需要同步对批次中作业列表的访问权限。 (“同步”本质上意味着“确保线程知道潜在的竞争条件”。在大多数情况下,这意味着“让一些方法一次只能由一个线程执行”。)
使用java.util.concurrent
包最容易解决。请查看BlockingQueue
或ArrayBlockingQueue
的LinkedBlockingQueue
的各种实现。
答案 2 :(得分:3)
将批次放入BlockingQueue
并使您的工作线程从队列中取出批次。
答案 3 :(得分:3)
检索批次时使用lock
或mutex
。这样,线程无法同时访问关键部分,也不会意外访问同一批次。
我假设你在线程挑选后删除了一批。
编辑:aioobe和jonas的答案更好,使用它。这是另一种选择。 :)