为什么我的线程程序只使用一个CPU?

时间:2012-05-08 21:47:10

标签: java multithreading cpu

我有一个执行长时间计算的程序,所以我想加快它的性能。所以我此刻试图启动3个线程,但是java.exe仍然占用CPU使用率的25%(因此,只使用了一个CPU),即使我尝试使用.setPriority(Thread.MAX_PRIORITY);并设置它也是如此java.exe实时优先级(24)。我尝试使用RealtimeThread,但似乎它的工作速度更慢。如果将每个线程分配给一个处理器并且总CPU使用率增加到75%,那将是完美的,但我不知道该怎么做。这就是我的代码现在的样子:

Thread g1 = new MyThread(i,j);
g1.setPriority(Thread.MAX_PRIORITY);
g1.run();
Thread g2 = new MyThread(j,i);
g2.setPriority(Thread.MAX_PRIORITY);
g2.run();
Thread g3 = new MyThread(i,j);
g3.setPriority(Thread.MAX_PRIORITY);
g3.run();
if (g1.isAlive()) {
        g1.join();
}
if (g2.isAlive()) {
        g2.join();
}
if (g3.isAlive()) {
        g3.join();
}

3 个答案:

答案 0 :(得分:23)

你实际上并没有使用线程。

您需要致电.start(),而不是.run()

答案 1 :(得分:11)

这与CPU无关 - 你实际上并没有启动3个线程,而是在主线程上运行所有内容。要启动主题,请调用其start()方法,而不是run()

答案 2 :(得分:6)

首先,正如其他人所说,你并没有真正使用多个线程。这是因为你正在调用run()方法,该方法最终在调用线程中完成工作。

现在,为了解决你提出的其余问题,我认为这意味着如何最大限度地提高多线程进程的效率。这不是一个简单的问题,但我会给你基础知识。 (其他人,请随意加入。)

最大限度地提高流程效率的最佳方法是尝试让所有线程执行大量相同的工作,并尝试阻止它们阻塞。也就是说,为了使应用程序高效运行,您的工作就是“平衡”工作负载。

通常,您不能指定在特定CPU内核上运行的线程;这通常是操作系统和CPU本身的工作。操作系统调度进程(使用您提供的优先级),然后CPU可以在指令级别进行自己的调度。除了设置优先级之外,其余的调度完全不受您的控制。

编辑:我沉迷于分号。