您的最后一个假设并不完全正确。ExecutorService
不会拉取任务的副本。程序必须单独提供由ExecutorService
. 当一个任务完成后,队列中的下一个任务将被执行。
AnExecutorService
是用于处理线程池的接口。您通常在池上执行多个任务,每个任务都针对问题的不同部分进行操作。作为开发人员,您必须在创建任务时指定每个任务应处理的问题的哪些部分,然后再将其发送到ExecutorService
. 每个任务的结果(假设他们正在解决一个常见问题)应该添加到一个BlockingQueue
或其他并发集合中,另一个线程可以使用结果或等待所有任务完成。
这是一篇您可能想阅读的关于如何使用的文章ExecutorService
:http ://www.vogella.com/articles/JavaConcurrency/article.html#threadpools
更新: 的一个常见用途ExecutorService
是实现生产者/消费者模式。这是我快速整理的一个示例以帮助您入门——它仅用于演示目的,为简单起见,省略了一些细节和关注点。线程池包含多个生产者线程和一个消费者线程。正在执行的工作是将 0...N 中的数字相加。每个生产者线程对较小的数字区间求和,并将结果发布到BlockingQueue
. 消费者线程处理添加到BlockingQueue
.
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class NumberCounter {
private final ExecutorService pool = Executors.newFixedThreadPool(2);
private final BlockingQueue<Integer> queue = new ArrayBlockingQueue(100);
public void startCounter(int max, int workers) {
// Create multiple tasks to add numbers. Each task submits the result
// to the queue.
int increment = max / workers;
for (int worker = 0; worker < workers; worker++) {
Runnable task = createProducer(worker * increment, (worker + 1) * increment);
pool.execute(task);
}
// Create one more task that will consume the numbers, adding them up
// and printing the results.
pool.execute(new Runnable() {
@Override
public void run() {
int sum = 0;
while (true) {
try {
Integer result = queue.take();
sum += result;
System.out.println("New sum is " + sum);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
private Runnable createProducer(final int start, final int stop) {
return new Runnable() {
@Override
public void run() {
System.out.println("Worker started counting from " + start + " to " + stop);
int count = 0;
for (int i = start; i < stop; i++) {
count += i;
}
queue.add(count);
}
};
}
public static void main(String[] args) throws InterruptedException {
NumberCounter counter = new NumberCounter();
counter.startCounter(10000, 5);
}
}