随着时间的推移,FixedThreadPool中的执行速度变慢

时间:2016-04-25 14:44:19

标签: java multithreading collections

我需要完成大约100000个任务,我知道它们是CPU密集型的,但只需要很短的执行时间(当CPU足够快时)。

我使用ExecutorService executor = Executors.newFixedThreadPool(8);

我选择8,因为我的CPU有8个核心。

然后处理我的任务,我遍历所有这些:

for(Task task : tasks) {
     executor.submit(new Runnable() {
     // 1. Text analyzing
     // 2. Add result to a LinkedBlockingQueue
     }
}

我观察到的是,对于前几千个任务,它真的很快。但是,经过10k任务处理后,速度会变慢,速度变慢......

我试图理解,但未能弄清楚为什么它逐渐变慢。从任务完成后,资源也将被释放。所以我预计处理速度应该是稳定的。

然后我发现问题可能属于我用来存储任务结果的LinkedBlockingQueue。但似乎LinkedBlockingQueue提供了良好的插入性能。

在这种情况下,有人可以给我一些提示或建议吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

问题属于LinkedBlockingQueue的性能下降。在我的情况下,生产者在向队列添加数据方面更有效率,而消费者处理的速度太慢。

Java performance problem with LinkedBlockingQueue