在servlet中我希望在另一个线程运行时有一个response.print()

时间:2012-03-10 22:49:57

标签: java multithreading servlets

我有一个繁琐的对象必须在后台工作,我创建一个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在后台开心地工作?

2 个答案:

答案 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与数据库相关联。然后,您可以在每个后续请求中轮询该任务是否已完成(即,它已将结果存储在您希望看到它的位置)。