多线程Java线程高cpu利用率?
我有两条线。我首先调用一个线程(SocketThread
),然后从该线程调用另一个线程(“ProcessThread”)。我的问题是,在执行期间,CPU使用率为50%。当我在ProcessThreadrun
方法中添加TimeUnit.NANOSECONDS.sleep(1)
时,它将减少到0%。这是修改的正确方法吗?或任何减少杯子利用率的建议
下面是我的代码:
public class SocketThread extends Thread {
private Set<Object> setSocketOutput = new HashSet<Object>(1, 1);
private BlockingQueue<Set<Object>> bqSocketOutput;
ProcessThread pThread;
@Override
public void run() {
pThread = new ProcessThread(bqSocketOutput);
pThread.start();
for(long i=0; i<= 30000; i++) {
System.out.println("SocketThread - Testing" + i);
}
}
}
public class ProcessThread extends Thread {
public ProcessThread(BlockingQueue<Set<Object>> bqTrace) {
System.out.println("ProcessThread - Constructor");
}
@Override
public void run() {
System.out.println("ProcessThread - Exectution");
while (true) {
/*
try {
TimeUnit.NANOSECONDS.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
}
}
}
# 1 楼答案
你有两个紧密的循环,只要有工作要做,就会占用CPU。睡眠是降低应用程序速度(并降低CPU利用率)的一种方法,但它很少达到预期效果
如果你坚持睡觉,你需要将睡眠时间增加到至少20毫秒,并从那里开始调整。您还可以在完成一批任务后查看睡眠情况。在SocketThread打印循环中还需要类似的睡眠
# 2 楼答案
您可以通过休眠线程来“降低CPU利用率”,但这意味着您无法在这些线程上完成任何工作(或者,如果您是,那么完成这些工作的速度要比让线程完全运行慢得多)。这就像说你可以通过每隔几英里停车并关闭发动机来降低汽车的油耗
通常,在没有某种阻塞线程同步的情况下运行的
while(true)
循环(如.Wait()
,或者在您的情况下,如@martinjames所建议的BlockingQueue.take()
)是一种代码气味,指示应该重构的代码# 3 楼答案
如果工作线程通过调用take()在阻塞队列上等待,则它不应消耗CPU资源
如果它处于一个不做任何事情的紧密循环中(如示例中的代码所示),那么它当然会消耗资源。在循环中调用sleep作为限制器可能不是最好的主意