TestDialog好像不是线程安全的,这可能是一个原因。还有就是应该做缓冲,线程的个数应该有个上限,来不及的数据先存到缓冲中,当然缓冲也应该有一个上限,否则很容易死掉的
解决方案 »
- 初学者求助:java连接mysql, Class.forName()运行不成功
- HQL 多表联合查询
- ibatis updateByExample相关
- JAVA下拉列表出现问题
- 无原因向sun送分
- 面试题
- 高手来!先谢谢了,为什么webservice response的xml结构不一样啊?
- 一个JAVA问题,在很多论坛问了都没人能给个根本的答复,希望这里的高手能给我个好的答复
- tomcat 下rar文件下载的问题
- Java Web Studio系列开发工具Visaul Struts版本下载地址:ftp://210.36.64.79/kui
- 学习J2EE的一系列问题
- 如何把rs对象放到collection中?
class ReceiveBuffer()
{
private Queue q = new Queue();
synchronized void add(Object p) { q.add(p) };
synchronized Object pick() { return q.removeFirst(); }
synchronized boolean isEmpty() { return q.isEmpty(); }
}一个监听线程负责接收数据包:
class Reciever extends Thread {
run()
{
while(!socket.isClosed())
PackageData p = getData(); // 应该是一个阻塞方法
}一个线程专门处理数据包:
class Handler extends Thread{
run()
{
while(!stop)
{
if(queue.isEmpty())
{
sleep(20);
}
else
{
PackageData d = queue.pick();
// 处理数据包
................
}
}
}cpu利用率为1-3%
其实最佳方案是:判断queue.isEmpty()如果为空,Handler线程就进入等待状态
在Queue.add()方法中唤醒Handler线程这样比sleep()更省cpu但是调用wait, notify方法
java要求在正确的对象中正确的位置调用,不然会抛出exception我正在看<<java multithread programming>>,java doc也没说清楚这个问题