如何在Java中进行多线程处理

时间:2011-11-01 12:39:58

标签: java multithreading synchronize

我必须多线程运行1000批次代码的方法。我需要将这些批次分配给不同的线程。

目前我已经产生了3个线程但是所有3个线程都在挑选第一批1000个线程。 我希望其他批次不应该选择相同的批次而是选择另一批次。

请帮助并提出建议。

4 个答案:

答案 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包最容易解决。请查看BlockingQueueArrayBlockingQueueLinkedBlockingQueue的各种实现。

答案 2 :(得分:3)

将批次放入BlockingQueue并使您的工作线程从队列中取出批次。

答案 3 :(得分:3)

检索批次时使用lockmutex。这样,线程无法同时访问关键部分,也不会意外访问同一批次。

我假设你在线程挑选后删除了一批。

编辑:aioobe和jonas的答案更好,使用它。这是另一种选择。 :)