このスレッドローカルパターンに従ってvaadinアプリケーションを実装しています。
アプリケーションの状態は、いくつかのワーカースレッドによって変更されます。したがって、アプリケーションの状態が変化したことをアプリケーションに通知するために、進行状況インジケーターを追加します。
進行状況インジケーターのサンプルを読むと、次のように表示されます。
// All modifications to Vaadin components should be synchronized
// over application instance. For normal requests this is done
// by the servlet. Here we are changing the application state
// via a separate thread.
synchronized (getApplication()) {
prosessed();
}
getApplication
したがって、基本的には、アプリケーションのインスタンスを取得するために呼び出しを変更する必要があると思います(呼び出すだけですgetCurrent
)。
private static ThreadLocal<MyApplication> currentApplication = new ThreadLocal<MyApplication>();
@Override
public void init() {
setCurrent(this); // So that we immediately have access to the current application
// initialize mainWindow and other stuff
// Register a transaction listener that updates our ThreadLocal with each request
if (getContext() != null) {
getContext().addTransactionListener(this);
}
}
/**
* @return the current application instance
*/
public static MyApplication getCurrent() {
return currentApplication.get();
}
問題は、アプリケーションでミューテックスを取得できないため、ワーカースレッドが飢餓状態で停止することです。vaadinフォーラムが提供する1つの解決策は、InheritableThreadLocalを使用することです。動作しますが、理由がわかりません。
javadocから:
このクラスはThreadLocalを拡張して、親スレッドから子スレッドへの値の継承を提供します。子スレッドが作成されると、子は、親が値を持つすべての継承可能なスレッドローカル変数の初期値を受け取ります。通常、子の値は親の値と同じになります。ただし、このクラスのchildValueメソッドをオーバーライドすることにより、子の値を親の任意の関数にすることができます。
継承可能なスレッドローカル変数は、変数で維持されているスレッドごとの属性(たとえば、ユーザーID、トランザクションID)を、作成された子スレッドに自動的に送信する必要がある場合に、通常のスレッドローカル変数よりも優先して使用されます。
ワーカースレッドは初期値を受け取らないため、ロックを取得できませんか?私は何かを誤解していますか?この問題を除いて、私が知っておくべきInheritableThreadLocalを使用することの潜在的な落とし穴は何ですか?
ありがとう。