public class StatDataWorker {
private final PoolWorker[] threads;
private final LinkedList queue = new LinkedList(); public StatDataWorker(int nThreads) {
threads = new PoolWorker[nThreads];
for (int i = 0; i < nThreads; i++) {
threads[i] = new PoolWorker();
threads[i].start();
}
} public boolean isEmpty() {
return queue.isEmpty();
} public boolean workOver() {
for (int i = 0; i < threads.length; i++) {
if(!threads[i].saveOk) return false;
}
return true;
} public void execute(ParsedData parsedData) {
synchronized(this.queue) {
this.queue.add(parsedData);
this.queue.notify();
}
} private class PoolWorker extends Thread {
private ParsedData parsedData = null;
private boolean saveOk = true; 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 {
this.saveOk = false;
if(this.parsedData != null) {
StatDataParser _parser = new StatDataParser();
_parser.parse(this.parsedData);
_parser.save();
this.parsedData = null;
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
this.saveOk = true;
}
}
}
}
}这是我的一个线程组的源代码,但是当队列没有空闲的情况下,这种写法的CPU使用率就会上升很快,甚至到100%,极其影响服务器的性能,有没有更高的写法能解决CPU使用率的问题,谢谢了。
private final PoolWorker[] threads;
private final LinkedList queue = new LinkedList(); public StatDataWorker(int nThreads) {
threads = new PoolWorker[nThreads];
for (int i = 0; i < nThreads; i++) {
threads[i] = new PoolWorker();
threads[i].start();
}
} public boolean isEmpty() {
return queue.isEmpty();
} public boolean workOver() {
for (int i = 0; i < threads.length; i++) {
if(!threads[i].saveOk) return false;
}
return true;
} public void execute(ParsedData parsedData) {
synchronized(this.queue) {
this.queue.add(parsedData);
this.queue.notify();
}
} private class PoolWorker extends Thread {
private ParsedData parsedData = null;
private boolean saveOk = true; 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 {
this.saveOk = false;
if(this.parsedData != null) {
StatDataParser _parser = new StatDataParser();
_parser.parse(this.parsedData);
_parser.save();
this.parsedData = null;
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
this.saveOk = true;
}
}
}
}
}这是我的一个线程组的源代码,但是当队列没有空闲的情况下,这种写法的CPU使用率就会上升很快,甚至到100%,极其影响服务器的性能,有没有更高的写法能解决CPU使用率的问题,谢谢了。
解决方案 »
- 求高手~struct1可以在web.xml里设置欢迎界面为.do吗?
- 客户端用axis2调webServer出错
- spring+struts+hibernate框架整合问题紧急求助
- 求助(网站发布)
- 高薪需要25名j2ee开发人员,要求有大型系统开发经验,由银行系统开发经验优先
- 20天能不能学会J2EE?
- 请问从数据库中取值时,如何不以科学计数法显示double类型?
- Hql参数问题
- tomcat启动报错,java.lang.ClassNotFoundException: org.slf4j.Logger,包都在就是找不到求大神解答 急在线等
- Java web 用FTP上传文件
- 开发网上商城流量预测
- jxl操作excel 问题!搞定结!
由于服务器是一个高并发的服务器,所以当并发数越多时队列就有可能存在非空闲的情况,这个时候while(true)就相当于陷入了死循环,而不会启用wait,从而导致CPU使用率上升。
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();
}
}
}
}
}
public&npsp;class&npsp;StatDataWorker&npsp;{
&npsp;&npsp;private&npsp;final&npsp;PoolWorker&npsp;thread;
&npsp;&npsp;private&npsp;final&npsp;LinkedList&npsp;queue&npsp;=&npsp;new&npsp;LinkedList();&npsp;&npsp;public&npsp;StatDataWorker()&npsp;{
&npsp;&npsp;&npsp;&npsp;thread&npsp;=&npsp;new&npsp;PoolWorker();
&npsp;&npsp;}&npsp;&npsp;public&npsp;void&npsp;execute(ParsedData&npsp;parsedData)&npsp;{
&npsp;&npsp;&npsp;&npsp;synchronized(this.queue)&npsp;{
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;this.queue.add(parsedData);
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;this.queue.notify();
&npsp;&npsp;&npsp;&npsp;}
&npsp;&npsp;}&npsp;&npsp;private&npsp;class&npsp;PoolWorker&npsp;extends&npsp;Thread&npsp;{
&npsp;&npsp;&npsp;&npsp;private&npsp;ParsedData&npsp;parsedData&npsp;=&npsp;null;&npsp;&npsp;&npsp;&npsp;public&npsp;void&npsp;run()&npsp;{
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;while&npsp;(true)&npsp;{
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;synchronized(queue)&npsp;{
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;while&npsp;(queue.isEmpty())&npsp;{
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;try&npsp;{
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;queue.wait();
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;}&npsp;catch&npsp;(Exception&npsp;ex)&npsp;{ex.printStackTrace();}
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;}
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;try&npsp;{
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;this.parsedData&npsp;=&npsp;(ParsedData)&npsp;queue.removeFirst();
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;}&npsp;catch&npsp;(Exception&npsp;ex)&npsp;{ex.printStackTrace();}
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;}
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;try&npsp;{
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;if(this.parsedData&npsp;!=&npsp;null)&npsp;{
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;StatDataParser&npsp;_parser&npsp;=&npsp;new&npsp;StatDataParser();
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;_parser.parse(this.parsedData);
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;_parser.save();
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;this.parsedData&npsp;=&npsp;null;
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;}
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;}&npsp;catch&npsp;(Exception&npsp;ex)&npsp;{
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;ex.printStackTrace();
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;}
&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;}
&npsp;&npsp;&npsp;&npsp;}
&npsp;&npsp;}
}