在Executors.newFixedThreadPool()中增加线程数会减慢速度

时间:2013-12-15 06:51:27

标签: java multithreading executorservice threadpoolexecutor

如果线程数从nThread增加到nThread + 1,速度会减半。

ExecutorService executor = Executors.newFixedThreadPool(nThread);

如果我只是将nThread设置为1,它就不会使用我的所有内核。发生了什么事?

我的任务不涉及阅读文件或网络。它创建对象和计算。但是,它从矢量中读取数据。

从同一向量读取数据的多个线程可以降低性能吗?如果是这样,我该如何解决呢?

2 个答案:

答案 0 :(得分:0)

vector是一个旧列表实现,依赖于锁来提供线程安全性。如果多个线程同时访问该向量,则这些线程将遭受锁争用,这可能就是您现在所经历的。

如果只读取向量,我会用ArrayList(或数组)替换它。因为没有锁定,并且在只读数据结构的情况下,不需要。

答案 1 :(得分:0)

如果线程数量多于任务数量,则上下文切换将会很慢,因为线程池执行程序中的线程具有相同的优先级,并且必须在它们之间共享CPU。线程数也越多,线程等待监视器的机会就越多。

即使没有同步,更多线程也会严重影响性能。 在我使用的其中一个应用程序中,有一个xml解析任务需要100毫秒,当线程数从10增加到50时增加到5秒。

配置线程池是一个学习和实现的东西。它取决于CPU中的内核数量,更多内核将允许更多的并行处理。