下面是源代码,目前面临的问题是:当队列queue不空闲的时候,由于线程PoolWorker中采用了while(true)的写法,导致CPU使用率会快速上升。有什么其他的写法可以解决此问题。public class StatDataWorker {
private final PoolWorker thread;
private final LinkedList queue = new LinkedList(); public StatDataWorker() {
thread = new PoolWorker();
} public void execute(ParsedData parsedData) {
synchronized(this.queue) {
this.queue.add(parsedData);
this.queue.notify();
}
} private class PoolWorker extends Thread {
private ParsedData parsedData = null; public void run() {
while (true) {
synchronized(queue) {
while (queue.isEmpty()) {
try {
queue.wait();
} catch (Exception ex) {ex.printStackTrace();}
}
try {
this.parsedData = (ParsedData) queue.removeFirst();
} catch (Exception ex) {ex.printStackTrace();}
}
try {
if(this.parsedData != null) {
StatDataParser _parser = new StatDataParser();
_parser.parse(this.parsedData);
_parser.save();
this.parsedData = null;
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
}
private final PoolWorker thread;
private final LinkedList queue = new LinkedList(); public StatDataWorker() {
thread = new PoolWorker();
} public void execute(ParsedData parsedData) {
synchronized(this.queue) {
this.queue.add(parsedData);
this.queue.notify();
}
} private class PoolWorker extends Thread {
private ParsedData parsedData = null; public void run() {
while (true) {
synchronized(queue) {
while (queue.isEmpty()) {
try {
queue.wait();
} catch (Exception ex) {ex.printStackTrace();}
}
try {
this.parsedData = (ParsedData) queue.removeFirst();
} catch (Exception ex) {ex.printStackTrace();}
}
try {
if(this.parsedData != null) {
StatDataParser _parser = new StatDataParser();
_parser.parse(this.parsedData);
_parser.save();
this.parsedData = null;
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
}
我看Queue这个类的实例就是LinkedList,你能提供一个给我么,我了解下,对jdk本身的队列不是很熟悉,谢谢了。
你需要的可能是java.util.concurrent.LinkedBlockingQueue吧。不太确定你的需求。
嗯,我也发现了,刚看了LinkedBlockingQueue的jdk文档,全自动的,呵呵。