首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Executors -需要一个LinkedBlockingQueue

Executors -需要一个LinkedBlockingQueue
EN

Stack Overflow用户
提问于 2013-04-28 15:37:11
回答 1查看 577关注 0票数 1

当我们讨论使用Executors服务处理异步事件时,为什么创建一个新的固定线程池涉及到LinkedBlockingQueue的使用?到达的事件是完全不依赖的,所以为什么要使用队列,因为使用者线程仍然会涉及对take锁的争用?为什么Executors类不具有某种混合数据结构(例如并发Map实现),而在大多数情况下不需要take锁?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-28 18:03:59

线程池执行器使用BlockingQueue有很好的理由(顺便说一句,你不一定要使用LinkedBlockingQueue实现,你可以使用BlockingQueuedifferent implementations )。队列应处于阻塞状态,以便在没有任务可执行时挂起工作线程。此阻塞是使用wait on条件变量完成的,因此当队列为空时,等待的工作线程不会消耗任何CPU资源。

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

更新:

好了,现在我完全理解了用例。不管怎样,你仍然需要阻塞收集。原因基本上是一样的-既然你实现了生产者-消费者,你就应该有让工作线程等待消息到达的方法-而这在没有互斥+条件变量(或者简单地说是BlockingQueue)的情况下是做不到的。

关于map -是的,我知道你想如何使用它,但不幸的是没有提供这样的实现。最近,我解决了类似的问题:我需要根据一些标准对传入的任务进行分组,并按顺序执行每个组中的任务。因此,我实现了自己的GroupThreadPoolExecutor来完成这种分组。想法很简单:将传入的任务分组到map中,然后在组中的前一个任务完成时将它们添加到executor队列中。

有一个很大的讨论here -我认为它与你的问题相关。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16260723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档