使用线程多于硬件线程时的注意事项?

时间:2011-09-24 00:12:35

标签: java multithreading

我有一台配备i7 2630qm CPU(4核,8线程)的全新笔记本电脑,我很高兴能够充分利用多核处理器的强大功能。

在阅读了关于线程之后,我意识到在编写最有效的代码方面我遇到了一些困惑。

我有大约200个表,每个表有大约40,000个记录。我计划将每个表完整地拉到java程序中的多维数组中,并对数组运行模拟。

显然,每个线程会有一个数组,但我想知道的是:我是否会同时创建所有(200)线程,RAM允许或编写只是切换数组的代码会带来任何好处8个线程之间?

我的意思是,根据我的理解,我的i7只有8个硬件线程。

3 个答案:

答案 0 :(得分:3)

我会调查Thread Pools因为它们可能有助于解决限制并发线程数的基本愿望。

根据我的经验(在Windows中),更多线程(大约是核心线程的2倍)允许具有独立CPU绑定线程的代码运行得更快:也就是说,程序可以窃取更优先于操作系统可能会给其他进程;-)设置线程优先级也有帮助,当然,IO绑定线程是一个完全不同的故事。

请记住,您的代码不是孤立运行的,操作系统最终负责线程调度:

了解“肯定”的唯一方法是尝试不同的事情并运行性能测试

结果可能令人惊讶并且受到许多因素的影响,包括但不限于JVM / OS,算法,线程争用和用户空间占空比(IO操作最终在kernel-land中)。还要记住,程序的不同部分可能会有完全不同的反应,甚至可能甚至没有意义来连接某些部分(例如读取初始数据),具体取决于瓶颈的实现位置和 - 不容忽视 - 程序的复杂性。

(使用线程池可以轻松调整允许的并发线程数,这也是我建议的原因之一。)

快乐的多线程编码。

答案 1 :(得分:1)

答案 2 :(得分:1)

答案是肯定的“它取决于”。拥有更多线程然后您的硬件支持可能会加快您的程序。例如,假设您有1个线程持有数据库的I / O锁,而其他7个线程等待它完成。在此期间让更多线程做其他工作肯定会加速这个计划。

由于您的程序似乎在数据库交互中执行了大量I / O操作,并且在收集数据后进行了大量CPU密集型工作,您可能会发现拥有8个以上的线程会使您的程序运行得更快

正如其他人所建议的那样,可能需要进行一些反复试验。祝你好运。