データをダウンロードするスレッドがあり、データをロードする前にダウンロードが完了するまで待つ必要があります。これを行う標準的な方法はありますか?Javaスレッドが終了するのを待つ
詳細:
私はURL(直列化されたPOJO)からデータを取得ダウンロードクラスを持っています。ダウンロードはRunnable and Observableです。ダウンロードしたバイト数とダウンロードサイズを記録します。ユーザーに進捗状況を表示するプログレスバーがあります。 GUIはダウンロードを観察してプログレスバーを更新します。
POJOがダウンロードされると、私はそれを取得して次のステップに移動したいと思います。各ステップは、前のステップが完了するのを待たなければなりません。問題は、ダウンロードスレッドを待つためにアプリケーションを一時停止する方法を考えることができないことです。ダウンロードが終了したら、データをオブジェクトとして返すdownload.getObject()を呼び出したいと思います。私はそれをキャストし、次のダウンロードで乗り越えることができます。
私は、ダウンロード用のURLを管理し、ダウンロードのすべての呼び出しを行うヘルパークラスを持っています。この呼び出しはgetObjectを呼び出し、キャストを行います。 Guiはhelper.getUser()を呼び出します。ヘルパーはスレッドの実行を開始し、キャストされたオブジェクトを返すことができるように、完了したら '知る'ようにします。
どのようなご提案ですか?私はこのデザインの最初の段階にありますので、私はそれを変更して喜んでいます。
ありがとうございました。
更新:
私はhttp://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html#getに続き、スレッドが終了するまでブロックするために、モーダルを使用しました。コードは非常に乱雑で、私はこのアプローチが嫌いです。私は、ダウンロードプロセスのワークフローを処理するための「きれいな」方法を見つけようとし続けます。
私は(参加しようとした)が、それは、更新からGUIを保ちました。私がスレッドを使用した理由は、ダウンロードが行われている間にGUIを更新し続けることでした。参加を呼び出すと、それが起こるのを止めます。 – Allan
join()が動作します。 GUIが更新を停止する場合は、おそらくあなたが参加しているスレッドについてより詳細に記述する必要があります。私はEDTに参加しません。 – akf
次に、スイングスレッドで 'join()'を呼び出さないようにする必要があります。これは、ダウンロードスレッドを担当する1つのスレッドを作成することで実行できます。これは本質的にあなたが忘れることのできるバックグラウンドワーカーです。ダウンロードが完了し、その時点で何をすべきかを知っているのはワーカースレッドです。スイングオブジェクトの編集がスイングスレッドで行われていることを確認するだけです。 SwingWorkerの場合は+1 – unholysampler