我有一个Vaadin应用程序,我正在实现一些异步后台处理。据我所知,来自客户端的所有请求都由Tomcat的线程池中的一个线程处理,并且在处理请求之后,响应(更新的应用程序的状态)将返回给客户端并呈现。
因为我有一些我想在后台执行的任务,我需要在主HTTP线程中显示一个'Loading ...'标签,在显示之后我需要启动一个执行任务的后台线程。它完成后,应用程序的状态被推送到客户端(使用ICEPush附加组件)。
问题是在我看来,有时后台线程在主HTTP线程返回客户端响应之前完成,因此没有显示“正在加载...”标签,有时候应用程序的状态没有完全更新客户因为那个。因此,我需要在主HTTP线程返回响应后启动后台线程。
有办法吗?或者我对这种方法完全错了?
谢谢!
答案 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();
}
}
}