在我们的多线程 java 应用程序中,我们为每个线程使用 LinkedBlockingDeque 单独的实例,假设线程 (c1, c2, .... c200)
线程 T1 和 T2 从套接字接收数据并将对象添加到 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 中,c1 到 c200 的搜索时间会更多并且搜索条件将扩展。3.让消费者有单独的Q来处理他们的请求
试图减少 CPU 使用率并需要您的输入...
标清