iteye_17041 2012-10-09 11:11
浏览 385
已采纳

http长连接如何保证一个用户只有一个长连接(一个线程)

一下代码不能实现
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的代码不能实现。

  • 写回答

2条回答 默认 最新

  • java小强 2012-10-09 13:32
    关注

    用户只要请求了线程就不要结束,一直存在!然后结合线程编号和用户信息保存这个线程!要保存用户最后一次请求事件,和是否执行!
    至于线程的结束,应该有一个线程单独处理这件事!任务线程根据保存的信息是否执行来做判断是否继续执行,然后单独线程根据最后请求时间判断用户是否超时,超时之后立马标记不执行,线程则自然直接结束!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图2.0 版本点聚合中Marker的位置无法实时更新,如何解决呢?
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题