【发布时间】:2023-03-16 14:23:01
【问题描述】:
对于常规的生产者-消费者问题,我们可以使用 ExecutorService 作为队列。它有什么缺点?效率低吗?因为创建线程的成本很高。
executor = Executors.newFixedThreadPool(90);
// This will be called many times concurrently
public void processObjectsWithFixedSetOfThreads(Foo objectToProcess) {
//Create a new thread and submit (executor is of fixed size hence extra tasks will be queued)
executor.submit(new ObjectProcessorWorker(objectToProcess));
}
class ObjectProcessorWorker implements Runnable() {
public ObjectProcessorWorker(Foo obj) {
this.obj = obj;
}
public void run() {
longRunningProcess(obj);
}
}
为什么推荐BlockingQueue 用于生产者-消费者问题,但也可以使用without that(如上所示)?
编辑
由于 ThreadPoolExecutor 内部维护 BlockingQueue,很多人没有得到区别。
在一家饼干厂,有一项任务是包装饼干。如果我是它的所有者,我有两种方法可以加快包装任务。
-
将饼干和包装纸放在流水线上,有10名工人在做包装工作。
我 ->
queue.put(biscuits, wrapper)工人 ->
queue.take() -
创建一个包装饼干的任务,然后将其放在流水线上,然后让 10 名工人去做。
我 ->
new Task(biscuits, wrapper)工人 ->
task = queue.take(); do(task);
我问的是后一种的缺点。
【问题讨论】:
-
它们根本不是一回事。执行器服务正在从队列中运行事物(它内部有一个阻塞队列,保存提交的任务);这不是队列本身。
-
@AndyTurner 我添加了一个编辑。
标签: java executorservice java.util.concurrent