我有两个主题。我首先调用一个(SocketThread
),然后从那个调用另一个线程('ProcessThread')。我的问题是,在执行期间CPU使用率为50%。当我在ProcessThread TimeUnit.NANOSECONDS.sleep(1)
方法中添加run
时,它会降低到0%。这是正确的修改方法吗?或者任何有关降低CUP利用率的建议。
以下是我的代码:
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();
}*/
}
}
}
答案 0 :(得分:1)
你可以通过休眠线程来“降低CPU利用率”,但这意味着你没有在这些线程上完成任何工作(或者如果你这样做,它的完成速度比你让线程运行完全慢得多 - 出)。这就像是说你可以通过停止每隔几英里并关闭发动机来减少汽车的油耗。
通常在没有某种阻塞线程同步的情况下运行while(true)
循环(如.Wait()
,或者在您的情况下,@ {Martin-James建议的BlockingQueue.take()
)是一个代码闻到并指出应该重构的代码。
答案 1 :(得分:1)
如果您的工作线程通过调用take()等待阻塞队列,则它不应占用CPU资源。
如果它处于一个没有任何作用的紧密循环中(如示例中的代码所示),那么它当然会消耗资源。在循环中调用sleep作为限制器可能不是最好的主意。
答案 2 :(得分:1)
只要有工作要做,你就有两个紧密的循环会占用CPU。睡眠是减慢应用程序速度(降低CPU利用率)的一种方法,但它很少(如果有的话)产生预期效果。
如果你坚持睡觉,你需要将睡眠时间增加至少20毫秒并从那里调整。您还可以查看一批任务后的睡眠状况。你还需要在SocketThread打印循环中进行类似的睡眠。