Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠线程会在5次请求后完全阻止浏览器_Java_Multithreading_Spring_Tomcat_Threadpool - Fatal编程技术网

Java 休眠线程会在5次请求后完全阻止浏览器

Java 休眠线程会在5次请求后完全阻止浏览器,java,multithreading,spring,tomcat,threadpool,Java,Multithreading,Spring,Tomcat,Threadpool,我的应用程序有一个问题——我试图通过监听一个内部请求来实现长轮询,并得到下面的这段代码 我遇到的问题是,它只在一个客户端(移动设备)发出5个请求后才会阻塞,在60秒后释放,这似乎是默认的会话超时。它在不同的客户机上运行良好,但同样,只有5个请求 我怎样才能解决这个问题 @RequestMapping(value = "/poll/{id}/{prop}", method = RequestMethod.POST) public @ResponseBody Response pol

我的应用程序有一个问题——我试图通过监听一个内部请求来实现长轮询,并得到下面的这段代码

我遇到的问题是,它只在一个客户端(移动设备)发出5个请求后才会阻塞,在60秒后释放,这似乎是默认的会话超时。它在不同的客户机上运行良好,但同样,只有5个请求

我怎样才能解决这个问题

@RequestMapping(value = "/poll/{id}/{prop}", method = RequestMethod.POST)
    public @ResponseBody
    Response poll(@PathVariable Long id, @PathVariable String prop){

        GameWrapper gameWrapper = GameRegistry.getById(id);
        PollRequest request = new PollRequest(gameWrapper, prop);

        request.listen();

        while(true){
            if(request.isCompleted()){
                return new SimpleObjectResponse(
                        SimpleObjectResponse.STATUS_SUCCESS,
                        gameWrapper.getGame()
                );
            }

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
编辑:我添加了整个方法,希望对您有所帮助。PollRequest是一个简单的侦听器,它监视GameWrapper的属性被单独的请求更改。当它检测到时,它将自己设置为“已完成”


编辑:我正在使用Tomcat 7和Spring MVC 3,我还尝试在Jetty上运行这个,并在Play框架中重新实现,同样的事情。我在Tomcat中增加了线程数,但这没有任何区别。

没有更多细节,很难回答。我建议您调试应用程序或添加
System.out.println(…)
或其他日志语句,以查看程序挂起的位置。为什么不使用同步?使用异步处理。睡工作线程是你能做的最糟糕的事情。