当前位置:  开发笔记 > 编程语言 > 正文

我应该在Java程序中使用多少个线程?

如何解决《我应该在Java程序中使用多少个线程?》经验,为你挑选了2个好方法。

我最近继承了一个小型Java程序,它从大型数据库中获取信息,进行一些处理并生成有关信息的详细图像.原作者使用单个线程编写代码,然后对其进行修改以允许它使用多个线程.

在代码中他定义了一个常量;

//  number of threads
public static final int THREADS =  Runtime.getRuntime().availableProcessors();

然后设置用于创建映像的线程数.

我理解他的理由是线程数不能大于可用处理器的数量,因此将其设置为从处理器中获取全部潜力的数量.它是否正确?或者是否有更好的方法来充分利用处理器的潜力?

编辑:为了进一步澄清,正在线程化的特定算法会扩展到正在创建的图片的分辨率(每个像素1个线程).这显然不是最好的解决方案.该算法所做的工作是一直需要的工作,并且是完全数学运算,没有锁或其他因素会导致任何给定的线程休眠.我只想最大化程序CPU利用率,以减少完成时间.



1> Kevin Day..:

线程很好,但正如其他人所说,你必须高度意识到你的瓶颈.您的算法听起来很容易受到多个CPU之间的缓存争用的影响 - 这尤其令人讨厌,因为它有可能达到所有线程的性能(通常您会想到使用多个线程在等待缓慢或高速时继续处理延迟IO操作).

缓存争用是使用多CPU处理高度并行化算法的一个非常重要的方面:确保考虑到内存利用率.如果您可以构造数据对象,以便每个线程都有自己正在处理的内存,那么可以大大减少CPU之间的缓存争用.例如,拥有大量的int并使不同的线程处理该阵列的不同部分可能更容易 - 但在Java中,对该阵列的边界检查将尝试访问内存中的相同地址,可能导致给定的CPU必须从L2或L3缓存重新加载数据.

将数据拆分为自己的数据结构,并配置这些数据结构,使它们是线程本地的(甚至可能更优化使用ThreadLocal - 实际上使用OS中的结构,提供CPU可用于优化缓存的保证.

我能给你的最好建议是测试,测试,测试.不要对CPU的将如何执行的假设-有一个巨大的魔法在CPU的事情这几天,常与直观的结果量.另请注意,JIT运行时优化将在此处添加额外的复杂层(可能很好,可能不是).



2> Will Hartung..:

一方面,你想要认为Threads == CPU/Cores非常有意义.为什么有一个线程,如果没有什么可以运行它?

细节归结为"线程在做什么".空闲等待网络数据包或磁盘块的线程浪费了CPU时间.

如果您的线程CPU很重,那么1:1的相关性就有一定意义了.如果你有一个"读取数据库"线程,它提供其他线程,并且单个"转储数据"线程并从CPU线程中提取数据并创建输出,那么这两个很可能很容易共享CPU而CPU重线程继续搅拌.

与各种各样的事情一样,真正的答案就是衡量它.由于该数字是可配置的(显然),请配置它!用1:1线程运行它到CPU,2:1,1.5:1,无论如何,并为结果计时.快一胜.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有