执行者 - 需要LinkedBlockingQueue

时间:2013-04-28 07:37:11

标签: java multithreading java.util.concurrent

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

1 个答案:

答案 0 :(得分:1)

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

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

更新:

好的,现在我完全理解了用例。仍然你需要阻止收集。原因基本相同 - 因为你实现了Producer-Consumer,你应该有工作线程等待消息到达的手段 - 这就是你不能没有mutex + condition变量(或者只是BlockingQueue)。

关于地图 - 是的,我理解你想如何使用它,但遗憾的是没有提供这样的实现。最近我解决了类似的问题:我需要按照某些标准对传入的任务进行分组,并按顺序执行每个组的任务。结果,我实现了自己的GroupThreadPoolExecutor来完成这个分组。这个想法很简单:将传入的任务分组到映射中,然后在组中的上一个任务完成时将它们添加到执行程序队列中。

有大讨论different implementations - 我认为这与你的问题有关。