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

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条回答

  • caozhy 从今以后生命中的每一秒都属于我爱的人 5年前

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

    点赞 1 评论 复制链接分享
  • andysern andysern 5年前

    请教一下,我现在把代码改成在主线程里去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负载,这个要怎么解决呢?
    
    点赞 评论 复制链接分享

相关推荐