我们先看一段代码,
while(true){
//do nothing
}
大家一看,这就是个啥事儿也没做的死循环啊,跑起来CPU会占用100%的。没错,这就是所说的“CPU空转”。之所以要说这个问题,是因为好多时候隐藏的死循环也一样会导致“CPU空转”。
我们再看一段代码,
run(){
while(true){
if(!queue.isEmpty()){
Object obj = queue.take();
//do something with obj
}
}
}
这是生产者-消费者模式中消费者的部分伪代码。在生产者没有生产的情况下,!queue.isEmpty()一直为真,将会导致“CPU空转”。
好多工作多年的Java程序员都会犯上面的错误。正确的写法是不判断queue是否为空,take方法会阻塞消费者线程,就不会导致“CPU空转”了。