0

ファイルをロードしていると同時に、ファイルがロードされていることをユーザーに通知するウィンドウを表示しているプログラムがあります。ファイルのロードを実際に処理する SwingWorker である FileLoader クラスと、渡された SwingWorker のステータスをユーザーに通知する PropertyChangeListener を実装する ProgressWindow を作成することにしました。

私のコードは現在次のようになっています。

FileLoader loader = new FileLoader(filePath);
new ProgressWindow(loader, "Loading File", "Loading File");
//ProgressWindow's constructor calls loader.execute() inherited from SwingWorker
doc = loader.getFile();

問題は、競合状態になっていることです。ProgressWindow が構築され、loader.execute() が呼び出され、タスクが完了するまで実行されます。上記のコードが実行を続ける前にすべてが完了することを期待していましたが、代わりに、ローダーの execute メソッドが実行されている間も実行が続けられ、競合状態が発生します。

Java の同期に関するものを読んでみましたが、理解するのに苦労しています。私がやりたいことは、FileLoader の isDone() メソッドが true を返すまで待ってから、loader.getFile() 行に進むことだけです。それを行う簡単な方法はありますか?それとも、それが最善の方法ですか?

4

1 に答える 1

0

わかりました、別の問題が発生したとしても、元の問題に対する答えを見つけました。SwingWorker<Void,Void>からに変更しSwingWorker<File,File>、組み込みの get() メソッドを使用してファイルを返すことができることがわかりました (Swingworker が完了するまで自動的に待機します)。これにより、同時実行の問題が解決されます。ただし、その過程で GUI が動かなくなってしまいましたが、それは別の問題のようです。

于 2012-07-17T21:08:59.943 に答える