1

当我们谈到使用 Executors 服务处理异步事件时,为什么创建一个新的固定线程池会涉及到 LinkedBlockingQueue 的使用?到达的事件根本不依赖,那么为什么要使用队列,因为消费者线程仍然会涉及获取锁的争用?为什么 Executors 类没有一些混合数据结构(例如并发 Map 实现),在大多数情况下不需要获取锁?

4

1 回答 1

1

线程池执行器与线程池执行器一起使用是有充分理由的BlockingQueue(顺便说一句,您不必使用 LinkedBlockingQueue 实现,您可以使用不同的实现BlockingQueue。当没有要执行的任务时,队列应该是阻塞的,以便挂起工作线程。这种阻塞是使用等待条件变量来完成的,因此当队列为空时,等待的工作线程不会消耗任何 CPU 资源。

如果您在线程池中使用非阻塞队列,那么工作线程将如何轮询要执行的任务?他们将不得不实施某种轮询,这是不必要的 CPU 资源浪费(它将是“忙于等待”)。

更新:

好的,现在我完全理解了用例。无论如何,您仍然需要阻止收集。原因基本相同——因为你实现了生产者-消费者,你应该有方法让工作线程等待消息到达——而如果没有互斥锁 + 条件变量(或简单的 BlockingQueue),你根本无法做到这一点。

关于地图 - 是的,我了解您想如何使用它,但不幸的是没有提供这样的实现。最近我解决了类似的问题:我需要按一些标准对传入的任务进行分组,并依次执行每个组中的任务。结果,我实现了自己的 GroupThreadPoolExecutor 来进行这种分组。这个想法很简单:将传入的任务分组到 map 中,然后当组中的前一个任务完成时将它们添加到执行者队列中。

这里有很大的讨论-我认为这与您的问题有关。

于 2013-04-28T10:03:59.140 回答