私は長い操作の進行状況を表示したい Swing にカスタムの進行状況バーパネルを持っています。そこで、2 つの swingworker を作成しました。
- Bean 管理のステートフル セッション Bean (longyTask) で実際に時間のかかる操作を行うもの
- フラグ (statusTask) に基づいてループ内で進行状況を ssb に要求するもの
ssb はブール変数を使用して、終了した場合にフラグを立てます
私の問題は、ssb が最終変数に割り当てられているにもかかわらず、ssb がイベント ディスパッチ スレッドと新しく作成されたスレッドで異なるオブジェクトになることです。statusTask が ssb.isDone() を要求すると、長いタスクがエラーなしで完了したことが確実にわかっていても、false が返されます。
擬似例:
final ProgressPanel p = new ProgressPanel();
final StatefulSessionBean ssb = getSSB();
p.print(ssb);
SwingWorker lengthyTask = new SwingWorker() { public void doInBackground(){p.print(ssb);} };
SwingWorker statusTask = new SwingWorker() {public void doInBackground(){p.print(ssb);} };
lengthyTask.execute();
statusTask.execute();
コードはさまざまなオブジェクトを出力します。swing アプリは EJB3 を使用して JBoss 4.2.3 と通信するため、ルックアップは JNDI で行われます。
同様の経験をした人や、スレッドごとにオブジェクトが異なる理由を理解している人はいますか? ご意見ありがとうございます。