当我们讨论使用Executors服务处理异步事件时,为什么创建一个新的固定线程池涉及到LinkedBlockingQueue的使用?到达的事件是完全不依赖的,所以为什么要使用队列,因为使用者线程仍然会涉及对take锁的争用?为什么Executors类不具有某种混合数据结构(例如并发Map实现),而在大多数情况下不需要take锁?
发布于 2013-04-28 18:03:59
线程池执行器使用BlockingQueue有很好的理由(顺便说一句,你不一定要使用LinkedBlockingQueue实现,你可以使用BlockingQueue的different implementations )。队列应处于阻塞状态,以便在没有任务可执行时挂起工作线程。此阻塞是使用wait on条件变量完成的,因此当队列为空时,等待的工作线程不会消耗任何CPU资源。
如果在线程池中使用非阻塞队列,那么工作线程将如何轮询要执行的任务?它们将不得不实现某种轮询,这是对CPU资源的不必要浪费(这将是“忙碌的等待”)。
更新:
好了,现在我完全理解了用例。不管怎样,你仍然需要阻塞收集。原因基本上是一样的-既然你实现了生产者-消费者,你就应该有让工作线程等待消息到达的方法-而这在没有互斥+条件变量(或者简单地说是BlockingQueue)的情况下是做不到的。
关于map -是的,我知道你想如何使用它,但不幸的是没有提供这样的实现。最近,我解决了类似的问题:我需要根据一些标准对传入的任务进行分组,并按顺序执行每个组中的任务。因此,我实现了自己的GroupThreadPoolExecutor来完成这种分组。想法很简单:将传入的任务分组到map中,然后在组中的前一个任务完成时将它们添加到executor队列中。
有一个很大的讨论here -我认为它与你的问题相关。
https://stackoverflow.com/questions/16260723
复制相似问题