0

Vaadin アプリケーションがあり、非同期バックグラウンド処理を実装しています。私の知る限り、クライアントからのすべてのリクエストは Tomcat のスレッド プールのいずれかのスレッドによって処理され、リクエストが処理された後、レスポンス (更新されたアプリケーションの状態) がクライアントに返されてレンダリングされます。

バックグラウンドで実行したいタスクがいくつかあるため、メインの HTTP スレッドに「読み込み中...」ラベルを表示する必要があり、表示された後、タスクを実行するバックグラウンド スレッドを開始する必要があります。アプリケーションの状態がクライアントにプッシュされます (ICEPush アドオンを使用)。

問題は、メインの HTTP スレッドがクライアントに応答を返す前にバックグラウンド スレッドが終了することがあるため、「読み込み中...」ラベルが表示されず、アプリケーションの状態がクライアントで完全に更新されないことがあるように思われることです。その。したがって、メイン HTTP スレッドが応答を返した後にバックグラウンド スレッドを開始する必要があります。

それを行う方法はありますか?それとも、このアプローチについて完全に間違っていますか?

ありがとう!

4

1 に答える 1

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();
           }
     }
}
于 2013-02-02T11:28:40.733 に答える