手动增加Java应用程序使用的CPU数量

时间:2011-01-15 19:49:19

标签: java multithreading

我刚刚用Eclipse创建了一个程序,需要很长时间才能执行。它花费的时间更长,因为它只将我的CPU加载到25%(我假设这是因为我使用的是四核,而程序只使用一个核心)。有没有办法让程序使用所有4个内核来最大化它? Java应该是本机多线程的,所以我不明白它为什么只使用25%。

5 个答案:

答案 0 :(得分:3)

您仍然需要在应用程序中手动创建和管理线程。 Java无法确定两个任务可以异步运行并自动将工作拆分为多个线程。

答案 1 :(得分:2)

这是一个非常含糊的问题,因为我们对你的程序的作用知之甚少。如果您的程序是单线程的,那么您机器上的核心数量就不会让它运行得更快。 Java确实具有线程支持,但它不会自动为您自动并行化代码。为了加快速度,您需要确定可以彼此并行运行的计算部分,并根据需要添加代码以拆分和重新构建工作。如果没有关于你的程序的更多信息,我无法帮助你。

需要注意的另一个重要细节是Java线程与系统线程不同。 JVM通常有自己的线程调度程序,它试图以一种公平的方式将Java线程放到实际的系统线程上,但实际上并没有保证它会这样做。

答案 2 :(得分:2)

是的,Java是多线程的,但多线程不会“通过魔法”发生。

查看Thread类或Executor框架。基本上你需要将你的工作分成“子任务”,每个子任务可以在一个处理器上运行,然后做这样的事情:

Executor ex = Executors.newFixedThreadPool(4);
while (thereAreMoreSubtasksToDo) {
  ex.execute(new Runnable() {
    public void run() {
      ... do subtask ...
    }
  });
}

将串行例程/算法转换为并行例程并不一定是微不足道的:您需要特别了解一系列广泛称为“线程安全”的问题。您可能对我撰写的关于thread-safety in Java的一些材料感兴趣,并且如果您按照链接进行一般的线程化:要记住的关键是,如果在运行的不同线程之间共享任何数据/对象,那么你需要采取特别的预防措施。也就是说,对于你想要“同时运行”的独立事物,上面的模式会让你开始。

答案 3 :(得分:1)

Java是多线程的,但如果您的应用程序只在一个线程中运行,则只使用一个线程。 (除了Java用于完成,垃圾收集等内部线程。)

如果您希望代码使用多个线程,则必须手动将其拆分,方法是自己启动线程或使用第三方线程池。我建议使用后一种选择,因为它更安全,但两者都能同样有效。

答案 4 :(得分:0)

你已经有了一些学习的东西(实际上,相当多的学习) - 但是如果你要做任何认真的编程,它会学到你应该做的。

这是一个起点:http://download.oracle.com/javase/tutorial/essential/concurrency/

但是你可能想看一本关于Java多线程的好书(我很久以前这么做过,我推荐的任何书都会绝版)。这类难题非常适合从文本而不是在线教程中学习。