我有一个繁琐的对象必须在后台工作,我创建一个servlet来调用这个对象并运行该对象我已经在我的servlet中实现了Runnable接口,如下所示:
public class myObject extends HttpServlet implements Runnable
{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
res.print("<br/> running...");
res.flush(); //doens't help
Thread t = new Thread(this);
t.run();
}
public void run()
{
res.print("<br/> running...");
res.flush();//doesn't helper either
cumbersomeObject.workHard();
}
}
如何打印这个简单的行,然后向用户发送200状态,我的servlet在后台开心地工作?
答案 0 :(得分:1)
将t.run()
更改为t.start()
,您的线程未在后台运行,但在前台阻塞。 BTW如何编译? run()
如何访问res
变量?
但是,您似乎试图通过线程中的res
响应对象向用户发送一些数据。这不起作用,请参阅HttpServletResponse seems to periodically send prematurely进行详细讨论。
答案 1 :(得分:1)
你犯了一个根本性的错误。 HTTP servlet请求和响应对象绑定到当前的HTTP请求线程。一旦该线程完成(即当HTTP请求/响应完成时),则关联的HTTP servlet请求和响应对象被删除并且完全无用。因此,如果您在初始HTTP请求/响应完成后在其他线程中使用这些对象,那么您将获得所有颜色的异常,因为它们无处可寻。
基于每个请求手动生成新线程也是一个非常糟糕的主意。线程并不便宜,绝对不是无限制的。而是使用5~10个线程或其他东西的池。如果您有这样的线程池,那么您只需向其提交一个任务,将其与HTTP会话中的某个唯一键相关联,甚至可以沿着登录的用户ID与数据库相关联。然后,您可以在每个后续请求中轮询该任务是否已完成(即,它已将结果存储在您希望看到它的位置)。