LinkedBlockingQueue.take() - 多线程中的单独实例

时间:2012-07-11 07:56:55

标签: java multithreading cpu take

在我们的多线程java应用程序中,我们为每个线程使用LinkedBlockingDeque单独的实例,假设线程(c1,c2,.... c200)

线程T1& T2从socket&amp ;;接收数据将对象添加到c1到c200之间的特定消费者Q.

run()内部的无限循环,它调用LinkedBlockingDeque.take()

在加载运行中,javae.exe本身的CPU使用率为40%。当我们总结系统中的其他进程时,整体CPU使用率达到90%。

通过使用JavaVisualVM,run()占用更多CPU,我们怀疑LinkedBlockingDeque.take()

尝试了一些替代方案,比如thread.wait和notify以及thread.sleep(0),但没有改变。

每个消费者有Q的原因有两个原因, 1. T1或T2可能有多个消费者c1请求 2.如果我们在单个q中转储所有req,c1到c200的搜索时间将更长,搜索条件将延长。 3.让消费者有单独的Q来处理他们的请求

尝试降低CPU使用率并需要输入......

SD

1 个答案:

答案 0 :(得分:0)

  1. 进行性能分析并确保队列方法占用相对较多的CPU时间。您的邮件处理是否如此简单,以及与放入/收集队列相比? 每秒处理多少条消息?有多少CPU?如果每个CPU每秒处理的消息少于100K,那么原因可能不是对队列的访问,而是消息处理本身。

  2. 放入LinkedBlockingDeque会创建一个辅助对象的实例。我怀疑,每个新消息都是从堆中分配的,因此每个消息创建2个。尝试使用预分配消息池和循环缓冲区。

  3. 200个线程太多了。这意味着上下文切换太多。尝试使用actor库和线程池,例如https://github.com/rfqu/df4j(是的,它是我的)。

  4. 检查http://code.google.com/p/disruptor/是否符合您的需求。