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

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

andysern
andysern 请教一下,我现在把代码改成在主线程里去while,然后收到连接后开启子线程去输出,程序运行是正常的 ,但是我发现一个问题,在tomcat下,每用浏览器进去页面,CPU负载就增加20%左右,基本上,如果开3个页面服务器就挂掉了。我怀疑是否是ajax的长 连接在进入服务器后,while阻塞增加了CPU负载,这个要怎么解决呢?(代码在后面回复
大约 4 年之前 回复
andysern
andysern 嗯,你的意思是说还是以while开始,接收到连接后再转给子线程。我想也是这样,之前在学习socket的时候,做一个服务端也是这样的。我试一下。
大约 4 年之前 回复

请教一下,我现在把代码改成在主线程里去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负载,这个要怎么解决呢?
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐