如何在Java中进行multithreading处理

我必须multithreading一个运行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(); 

将批处理放在BlockingQueue ,并使工作线程从队列中获取批处理。

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

我假设你被一个线程挑选后正在删除一个批处理。

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

您需要同步对批处理中作业列表的访问。 (“同步”本质上意味着“确保线程知道潜在的竞争条件”。在大多数情况下,这意味着“让一些方法一次只执行一些方法”。)

使用java.util.concurrent包最容易解决这个问题。 看看BlockingQueue的各种实现,例如ArrayBlockingQueueLinkedBlockingQueue