2013-12-15 82 views
0

如果线程数量从nThread增加到nThread + 1,则速度减少一半。在Executors.newFixedThreadPool()中增加线程数减慢

ExecutorService executor = Executors.newFixedThreadPool(nThread); 

如果我只是将nThread设置为1,它不会使用我所有的核心。这是怎么回事?

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

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

+2

向我们展示一些代码和一些时间。是的,并行访问同步共享资源的任务可能会降低速度。 –

回答

0

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

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

+0

您是否验证过使用像ArrayList这样的其他数据结构可以提供更好的性能? – pveentjer

0

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

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

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