如何在HTTP请求被提供并发送回客户端后启动后台线程?

时间:2013-01-31 09:59:36

标签: java multithreading tomcat vaadin server-push

我有一个Vaadin应用程序,我正在实现一些异步后台处理。据我所知,来自客户端的所有请求都由Tomcat的线程池中的一个线程处理,并且在处理请求之后,响应(更新的应用程序的状态)将返回给客户端并呈现。

因为我有一些我想在后台执行的任务,我需要在主HTTP线程中显示一个'Loading ...'标签,在显示之后我需要启动一个执行任务的后台线程。它完成后,应用程序的状态被推送到客户端(使用ICEPush附加组件)。

问题是在我看来,有时后台线程在主HTTP线程返回客户端响应之前完成,因此没有显示“正在加载...”标签,有时候应用程序的状态没有完全更新客户因为那个。因此,我需要在主HTTP线程返回响应后启动后台线程。

有办法吗?或者我对这种方法完全错了?

谢谢!

1 个答案:

答案 0 :(得分:0)

据我所知,更新线程中的UI必须与锁定机制一起完成。这是一个例子:

class Calculation implements Runnable {

    private long result = 0;

    private final Label label;

    public Calculation(Label label) {
        this.label = label;
    }

    @Override
    public void run() {
           // calculate or fetch the result (here is the time consuming operation) 
           getSession().getLockInstance().lock();
           try {
               // inform UI about result
               label.setValue("Result is: " + result);
           } finally {
               getSession().getLockInstance().unlock();
           }
     }
}