我有一个Vaadin应用程序,并且我正在实现一些异步后台处理。据我所知,来自客户端的所有请求都由Tomcat线程池中的一个线程处理,在处理请求之后,响应(更新后的应用程序的状态)被返回给客户端并呈现。
因为我有一些任务要在后台执行,所以我需要显示一个“正在加载...”。标签,在它显示之后,我需要启动一个后台线程来执行任务,当它完成时,应用程序的状态被推送到客户端(使用ICEPush附加组件)。
问题是在我看来,有时后台线程在主HTTP线程将响应返回给客户端之前就完成了,因此没有“加载...”。标签被显示,有时应用程序的状态不会因为此而在客户端上完全更新。因此,我需要在主HTTP线程返回响应后启动后台线程。
有没有办法做到这一点?或者我对这种方法完全错了?
谢谢!
发布于 2013-02-02 19:28:41
据我所知,线程中的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();
}
}
}https://stackoverflow.com/questions/14622990
复制相似问题