有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程java线程数>内核数和垃圾回收

我们使用的是Java7,正在开发多线程数据处理应用程序。由于某些限制,我们不使用spark或任何其他map reduce方法来解决此问题。这个项目的想法是使用多线程最大化应用程序的性能

我的理解是,在任何给定的点上,考虑到CPU并没有运行操作系统之外的任何其他东西,同时工作的线程数将等于CPU提供的超线程数。但是有一种javagc,它会时不时地出现。我们也必须考虑这个问题。

另外,我知道如果我创建更多的线程,那么由于在上下文切换中花费的时间,我实际上会降低性能

问题是什么是最好的方法来考虑所有这些事情并创建适当数量的线程。有什么想法或想法吗?还有其他的过程我应该考虑吗?


共 (2) 个答案

  1. # 1 楼答案

    我上学期确实做过这方面的研究。在使用线程时,为提高CPU限制进程的性能,一个好的经验法则是使用相同数量的线程作为核心,但在超线程系统的情况下除外,在这种情况下,应该使用两倍的核心。另一个可以总结的经验法则是I/O绑定的进程。这个规则是将每个核心的线程数增加到原来的四倍,除非是超线程系统,否则每个核心的线程数不能增加到原来的四倍

  2. # 2 楼答案

    The question is what would be the best way to consider all these things and create appropriate number of threads

    我会使用Java8来为您实现这一点。e、 g

    Results result = listOfWork.parallelStream()
                               .map(t -> t.doWork())
                               .collect(Collectors.reduce(.....));
    

    但是,如果您仍停留在Java 7上,则可以使用Executor服务

    int procs = Runtime.getRuntime().availableProcessors();
    ExecutorService es = Executors.newFixedThreadPool(procs);
    

    But there is java GC which will kick-in every now and then

    除非您使用的是CMS,否则它不会同时启动,所以这些线程在做什么(就调整线程池而言)无关紧要

    Is there any other process that I should consider?

    如果你在使用CPU的机器上有很多进程,你应该考虑它们。