5

当请求到达处理文件上传的 servlet 时,在该 servlet 中启动一个新线程是否是个好主意,该线程new Thread(r).start()将处理上传文件附带的另一条数据。我想以此来同时处理这两项工作。

4

3 回答 3

18

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

相信我,一些用户已经体验过:HttpServletResponse 似乎会定期发送过早

此外,每个请求都启动新线程是个坏主意,因为它的扩展性很差(某些规范甚至禁止它)。您可以做的是使用 Servlet 3.0 异步请求并异步处理上传,但最好使用一些线程池。另请参阅:为什么使用 startAsync 创建新线程而不是在 servlet 线程中工作?.

于 2012-04-26T08:56:44.583 回答
-2

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

于 2012-04-26T08:56:05.423 回答
-5

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

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

于 2012-04-26T08:53:25.713 回答