andysern 2016-09-01 09:56 采纳率: 6.3%
浏览 1303

AJAX长连接的服务器线程问题

正在学习AJAX的长连接的问题
在客户端用ajax去实现连接

  $.ajax({

      url: '/ajax',

      type: 'GET',

      data: 'what=test',

      timeout: 30000,

      //请求成功后触发

      success: function (data) {
clock = clock+1;
show.prepend('success invoke!' +data+'
');
switch(data){
case "error data":
//RevServer();

                        break;

                        case "ok":
                        RevServer();

                        break;

                        default:

                        }
                    },  


          //请求失败遇到异常触发  
          error: function (xhr, errorInfo, ex) { 
                    clockErr = clockErr+1;
                    show.prepend('error invoke!errorInfo:'+ errorInfo+"次数"+clockErr+'<br/>'); 
                    RevServer();
                    },


          //完成请求后触发。即在success或error触发后触发  
          complete: function (xhr, status) { 
                    show.prepend('complete invoke! status:' + status+",次数"+clock+'<br/>');
                     //RevServer();
                    }

现在出现一个问题,服务器端我之前是用while直接循环,但是好像多几次后就会使服务器产生异常。然后就往while里加了一个thread,但是这样一样,客户端就失效了,直接
进入了complete,如果不加thread就会一直处在连接中,加了线程连接就直接结束了。

switch(what){

        case "test":
            Thread test = new Thread(new Runnable(){//这里加了线程后,客户端就结束了
                public void run(){
                    while(a){
                        if(session.getAttribute("status")=="ok")a=false;
                    }
                    out.print("收到你的消息");
                    a = true;
                    session.setAttribute("status","nothing");
                }
            });
            test.start();

        break;

        case "setStatus":
            session.setAttribute("status","ok");
        break;  
    }

}


不加线程,就会比较好的运行。(不过感觉性能有问题)
switch(what){

        case "test":

                    while(a){
                        if(session.getAttribute("status")=="ok")a=false;
                    }
                    out.print("收到你的消息");
                    a = true;
                    session.setAttribute("status","nothing");
                }

        break;

        case "setStatus":
            session.setAttribute("status","ok");
        break;  
    }

}

请大家帮忙看看,如何加了线程让客户端良好运行呢你?
  • 写回答

2条回答 默认 最新

  • threenewbee 2016-09-01 12:51
    关注

    主线程要保持住,主线程如果退出了,那么进程结束了,子线程也就结束了。

    评论
  • andysern 2016-09-02 05:36
    关注

    请教一下,我现在把代码改成在主线程里去while,然后收到连接后开启子线程去输出,程序运行是正常的
    switch(what){

            case "test":
                Thread father = new Thread(new Runnable(){
                    public void run(){
    
                        a = true;
                        while(a){
                            if(map.get("status")=="ok"){
                                    a = false;
                                }                           
                        }
                        Thread son = new Thread(new Runnable(){
                            public void run(){
                                out.print("收到你的消息");
                                map.put("status","nothing");    
                            }
                        });
    
                        son.start();
                        try{
                        son.join();
                        }catch(Exception ex){
                            out.print(ex);
                        }
    
                    }
                });
    
                father.start();
                try{
                father.join();
                }catch(Exception ex){
                    out.print(ex);
                }   
    
            break;
    
            但是我发现一个问题,在tomcat下,每用浏览器进去页面,CPU负载就增加20%左右,基本上,如果开3个页面服务器就挂掉了。我怀疑是否是ajax的长
            连接在进入服务器后,while阻塞增加了CPU负载,这个要怎么解决呢?
    
    评论

报告相同问题?

悬赏问题

  • ¥15 求制作一个个人网页,
  • ¥15 寻涂色内存脚本作者有项目有市场有资源.却技术
  • ¥15 蓝桥杯c51单片机问题
  • ¥15 ajax跨域问题请求修改代码
  • ¥15 python matplotlib
  • ¥15 短信测压+语音,有偿,必须用Python
  • ¥20 COCOS2DX的protobuf协议注册函数问题
  • ¥15 (标签-Pytorch|关键词-Stream)
  • ¥15 求深圳2019年开放数据应用创新大赛的营运车辆数据!
  • ¥15 软件UI界面绘制折线图