Java线程 - 高cpu利用率?
我有两个线程。我正在调用一个(SocketThread
),然后从那个调用另一个线程('ProcessThread')。我的问题是,在执行过程中,CPU使用率为50%。当我在ProcessThread run
方法中添加TimeUnit.NANOSECONDS.sleep(1)
时,它减少到0%。这是修改的正确方法吗?或者一般的任何建议,以减少银联的使用。Java线程 - 高cpu利用率?
下面是我的代码:
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();
}*/
}
}
}
可以“降低CPU利用率”由休眠的线程,但是这意味着你没有得到这些线程所做的任何工作(或者如果你是,它越来越完成速度要比只让线程完全运行慢得多)。这就好像说你可以每隔几英里停车并关掉发动机来减少汽车的燃油消耗。
通常没有某种阻塞的线程同步的while(true)
循环正在运行(如.Wait()
,或在您的情况,一个BlockingQueue.take()
作为@马丁 - 詹姆斯建议)是一个代码的气味,并表示应重构代码。
爱车类比:) – ARRG 2012-02-22 16:22:05
如果您的工作线程通过调用take()在阻塞队列上等待,它不应占用CPU资源。
如果它在一个没有任何作用的紧密循环中(如示例中的代码所示),那么它当然会消耗资源。在循环中调用睡眠作为限制器可能不是最好的主意。
只要有工作要做,你就会有两个紧密的循环,它们会占用CPU。沉睡是减缓应用程序速度的一种方式(并降低CPU利用率),但很少有,如果有的话,所需的结果。
如果你坚持睡觉,你需要增加你的睡眠时间至少20毫秒,并从那里调整。您也可以在一批任务后查看睡眠状况。您还需要在SocketThread打印循环中进行类似的睡眠。
你在'while(true)'循环中实际做了什么?答案将取决于此。 – ARRG 2012-02-22 16:14:33
你正在ProcesThread中运行一个无限循环。除了使用完整的内核,你还期望什么? – Mat 2012-02-22 16:15:01
如果你实际上并没有在while循环中做任何事情,我可以向你保证你的CPU将非常忙于检查这个条件,并且相当长一段时间。如果你想让这个循环只是挂出来,那么你应该让它休息一下。 – deraj 2012-02-22 16:16:57