在servlet中启动一个新线程

时间:2012-04-26 08:51:03

标签: java multithreading servlets web

当请求到达处理文件上传的servlet时,最好使用new Thread(r).start()在该servlet中启动一个新线程,该线程将处理上传文件附带的另一段数据。我希望这能同时处理这两项工作。

3 个答案:

答案 0 :(得分:18)

这不仅是一个坏主意,但也不会奏效。原因如下:您的文件上传请求最终将命中doPost()方法。只要您使用此方法,容器就会保持连接打开状态。从该方法返回后(如果您决定在单独的线程中处理传入数据,doPost()将提前完成)容器假定您已完成请求并将关闭连接。从客户端的角度来看,服务器中断了上传。并且由于线程的异步性质,中断将在随机时刻发生。

相信我,一些用户已经体验过:HttpServletResponse seems to periodically send prematurely

此外,每个请求启动新线程是一个坏主意,因为这样做的扩展性很差(某些规范甚至禁止它)。你可以做的是使用Servlet 3.0异步请求并异步处理上传,但最好使用一些线程池。另见:Why create new thread with startAsync instead of doing work in servlet thread?

答案 1 :(得分:-2)

Web服务器在新线程中隐式运行Servlet,因此每当任何请求命中servlet时,它都将在不同的线程中执行。我没有预见到自己创建一个新线程的理由

答案 2 :(得分:-5)

在Servlet中启动新线程没有任何问题(与EJB不同),所以是的,没关系。

编辑:第二个想法@Tomasz Nurkiewicz是对的。文件上传将停止。