一下代码不能实现
servlet。用于等待数据返回
[code="java"]ChatControl control = null;
if (ChatListener.threadMap.get(receiver) == null) {
control= new ChatControl();//新建一个线程
ChatListener.threadMap.put(receiver , control);//线程塞进map
control.run();
ChatListener.threadMap.remove(receiver);
}else {
//如果是刷新,结束上一个长连接,此连接挂起
control= (ChatControl) ChatListener.threadMap.get(receiver);
control.breakThread();
control.interrupt();
ChatListener.threadMap.remove(receiver);
control = null;
//挂起
control = new ChatControl();
ChatListener.threadMap.put(receiver, control);
control.run();
ChatListener.threadMap.remove(receiver);
}[/code]
ChatControl类,继承线程,控制等待
[code="java"]public class ChatControl extends Thread {
private static Logger log = Logger.getLogger(ChatControl.class);
// private boolean isSuspend = true;//挂起标志
private boolean done = false;//线程停止标志
//测试内存使用情况
public static long getMemory() {
return Runtime.getRuntime().freeMemory();
}
/**
* 线程的主运行方法
* 主要是挂起,使得http连接保持一段时间
* 当有人发送聊天数据,修改接受人的线程结束标志done 结束线程 使得数据能返回
* 如果发起聊天,则5分钟返回一次。
* 使用阻塞 这里会很消耗资源。每个用户到这里都会被挂起,一直在等待。(考虑更优化的实现)
* !!目前可以使用负载均衡解决
*优点:但可以避免不断创建连接的过程,介绍握手的次数。返回时间会更短
*/
public void run()
{
Date newDate = DateUtil.getNowDateAndTime();
int i = 0;
while(!done){
try {
System.out.println("循环ing。。。。"+i++);
//睡眠2秒继续等待
sleep(2*1000);
//5分钟返回一次,避免资源一直在占用
if(DateUtil.getTwoTimeSub(DateUtil.getNowDateAndTime(), newDate) >= 5){
break ;
}
} catch (Exception e) {
log.error(Constants.getExceptionString("sleep()", ChatControl.class));
System.out.println("被打断退出。。。。");
break;//退出
}
}
}
public void update(String user) {
ChatControl control= (ChatControl) ChatListener.threadMap.get(user);
ChatListener.threadMap.remove(user);
if (control != null ) {
control.breakThread();
}
}
/**
* 继续执行
*/
public void breakThread() {
done = true;
}
/**
* 等待线程
*/
public void waitThread() {
done = false;
}
}[/code]
一个保存用户线程的类
[code="java"]public class ChatListener {
static public Map threadMap = new HashMap() ;//保存线程
}[/code]
当用户刷新的时候,线程会更加、
如何确保一个用户只有一个线程(一个长连接)
我的思路就是,如果用户刷新,终止上一个线程,该线程进入等待状态。上servlet的代码不能实现。