我必须对一个方法进行多线程处理,这个方法可以运行1000个批次的代码。我需要将这些批次分配给不同的线程。
目前我已经生成了3个线程,但所有3个线程都是第一批1000个线程。我希望其他批次不应该选择相同的批次,而应该选择其他批次。
请大家多多指教。
发布于 2011-11-01 20:51:14
我会使用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-01 20:41:37
您需要同步对批处理中作业列表的访问。(“同步”本质上是指“确保线程知道潜在的竞争条件”。在大多数情况下,这意味着“让某个方法一次由一个线程执行”。)
这是使用java.util.concurrent包最容易解决的问题。看看BlockingQueue的各种实现,例如ArrayBlockingQueue或LinkedBlockingQueue。
发布于 2011-11-01 20:42:01
将批处理放在一个BlockingQueue中,并使您的工作线程从队列中获取批处理。
https://stackoverflow.com/questions/7966593
复制相似问题