【问题标题】:How to start a background thread after the HTTP request is served and sent back to the client?在 HTTP 请求被服务并发送回客户端后,如何启动后台线程?
【发布时间】:2013-01-31 09:59:35
【问题描述】:

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

因为我有一些想要在后台执行的任务,我需要在主 HTTP 线程中显示一个“正在加载...”标签,在它显示后我需要启动一个后台线程来执行任务以及何时执行完成后,应用程序的状态被推送到客户端(使用 ICEPush 插件)。

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

有没有办法做到这一点?还是我对这种方法完全错误?

谢谢!

【问题讨论】:

  • 听起来您应该为后台线程快速完成做好准备,而不是依赖它花费更多时间。 . .更新 UI 代码。

标签: java multithreading tomcat vaadin server-push


【解决方案1】:

据我所知,在线程中更新 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();
           }
     }
}

【讨论】:

  • 我似乎在 Vaadin 代码的任何地方都找不到方法 getLockInstance()。这是Vaadin 7吗?我使用 Vaadin 6.8.8。
  • 是的,它只是在 Vaadin 7 中。在 Vaadin 6 中,试试这个:stackoverflow.com/questions/11553576/…
猜你喜欢
  • 2014-09-13
  • 2019-08-21
  • 2020-07-15
  • 1970-01-01
  • 2012-09-15
  • 2021-09-08
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多