如果线程数从nThread增加到nThread + 1,速度会减半。
ExecutorService executor = Executors.newFixedThreadPool(nThread);
如果我只是将nThread设置为1,它就不会使用我的所有内核。发生了什么事?
我的任务不涉及阅读文件或网络。它创建对象和计算。但是,它从矢量中读取数据。
从同一向量读取数据的多个线程可以降低性能吗?如果是这样,我该如何解决呢?
答案 0 :(得分:0)
vector是一个旧列表实现,依赖于锁来提供线程安全性。如果多个线程同时访问该向量,则这些线程将遭受锁争用,这可能就是您现在所经历的。
如果只读取向量,我会用ArrayList(或数组)替换它。因为没有锁定,并且在只读数据结构的情况下,不需要。
答案 1 :(得分:0)
如果线程数量多于任务数量,则上下文切换将会很慢,因为线程池执行程序中的线程具有相同的优先级,并且必须在它们之间共享CPU。线程数也越多,线程等待监视器的机会就越多。
即使没有同步,更多线程也会严重影响性能。 在我使用的其中一个应用程序中,有一个xml解析任务需要100毫秒,当线程数从10增加到50时增加到5秒。
配置线程池是一个学习和实现的东西。它取决于CPU中的内核数量,更多内核将允许更多的并行处理。