すべて、Java Asyncのデータロードと進捗状況とスレッドの悪夢
私たちのアプリケーションではデータのロードに問題があります。現在の実装の目的は、データロードのための非同期メカニズムを持つことでした。
私は基本的にこれに良いパターンや習慣があるかどうかを知りたいと思っています。
アプリケーションには、標準的な方法でコード化されていないさまざまなUIコンポーネントがあります。それはすべて構成(すなわちxml)から生成されます。データロードは、データローダーに非同期メッセージを送信するカレンダーをクリックすることによってトリガーされます。データローダーには、データベースからデータをロードする約6つのインスタンス(同じクラスのインスタンス)があります。データがロードされて処理されると、データローダクラスは、それを表示するJTableに非同期的にテーブルデータを送信します。
データのロードには1秒から2時間かかります分、進捗ダイアログが必要でした。データロードの開始/完了時に、データローダーからのイベントをリスンするための追加のクラスが作成されました。データローダが読み込みを開始すると、データが読み込まれていることを示すダイアログが表示されます。最後のデータローダーが完了したら、ダイアログを非表示にする必要があります。
現在の問題/課題
発生2つの問題があります。
- 時々ダイアログは、データローダの全てが完了しているにもかかわらず、表示されたままになりますが。
- その他の場合、データが表に表示されないことがあります。
私たちは、進行中の表示方法と非表示方法の周りにsynchronizedキーワードを追加しようと無駄にしようとしましたが、それと同様に発行されました。私はある種のリライトが順調であると思いますが、非同期Javaパターンについてもう少し理解したいと思います。このメカニズムは、より強固で信頼性の高いものでなければなりません。
現在のプロセス
私たちの現在のプロセスでは、あなたの興味があれば、私は以下のイベントを要約することを試みました。これは、設計/実装の問題を明らかにするかもしれない。
カレンダーのユーザーのクリック数。
カレンダーコンポーネントは、それぞれのデータローダーインスタンスに、読み込み開始を知らせるメッセージを送信します。このメッセージは、別のスレッド(2)で非同期にカレンダーから送信されます。
データローダは、ロード・メッセージ
を受信した各データローダは、関連データをロードして表示する表に渡す責任があります。
各データローダには、データがロードされる単一のスレッドインスタンスがあります。現在のスレッド・ロード・インスタンスが設定され、データをロードしている場合、ロードは中止されます。これは、カレンダー内のクイック・クリックから発生する可能性があります。新しいスレッドインスタンスは、データロードスレッドがアイドルまたはヌルになると作成され、開始されます。
データロードスレッドは、データアクセスと処理を実行します。起動されると、DataLoadDialogクラスに通知されます(3)。このDataLoadDialogは、基本的にリスナー(DataLoaderListener extends EventListener)をEventListenerListに追加します。データスレッドがロードされると、DataLoaderListener.loadStartが呼び出されます。これはDataLoadDialogによって取得されます。スレッドがデータをロードして処理すると、DataLoaderListener.loadCompleteが呼び出されます。これはDataLoadDialogで再び取り上げられます。
データがロードされたので、DataLoaderはデータをテーブルに送信して表示します。
は、負荷状態
DataLoadDialog各データローダへの参照を持つのDataLoadDialogを通知します。各データローダーは、ゲッターを介してアクセスされるステータスを持ち、IdleまたはLoadingの列挙型を返します。 DataLoadDialogは、loadStartまたはloadCompleteの呼び出しを受け取るたびに、データロードスレッドの状態に応じて進行状況ダイアログを表示するかどうかを決定します。
プロセスダイアログは、(構成XMLから)クラスが作成されたときに作成されるシングルトンの静的インスタンスです。
助けてください。私が何かを逃した場合は、コメントを追加してください、私は質問を更新します。
おかげで、
Andez
ありがとうございました。それを調べます。 SwingWorkerがこれまでに述べたことを聞いたことがあります。私の頭の中で、それが私たちのアプリケーション全体にどのようにフィットするかを知る必要があります。- – Andez
@kleopatra:何か追加できますか? SwingWorkerについて、ちょっと奇妙だけど、Netbeansを使ってデバッグした後に...あまりにも多くのSwingWorker-pool-threadが生きているのですが、これは何が起こったのでしょうか? – gumuruh