0

我有一个程序,我正在加载文件,同时我正在显示一个窗口以通知用户正在加载文件。我决定创建一个 FileLoader 类,它是一个 SwingWorker,它实际处理加载文件,以及一个实现 PropertyChangeListener 的 ProgressWindow,以通知用户传递给它的 SwingWorker 的状态。

我的代码目前如下所示:

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(),然后运行它的东西直到任务完成。我原本希望在上面的代码继续运行之前完成所有工作,但是在加载程序的执行方法运行时它会继续运行,从而导致竞争条件。

我试过阅读 Java 同步的东西,但我很难理解它。我要做的就是等到 FileLoader 的 isDone() 方法返回 true,然后继续 loader.getFile() 行。有没有简单的方法来做到这一点?或者就此而言,这是最好的方法吗?

4

1 回答 1

0

好吧,我找到了原始问题的答案,即使出现了另一个问题。我发现我可以从SwingWorker<Void,Void>to更改SwingWorker<File,File>,然后使用内置的 get() 方法返回文件(它会自动等待 Swingworker 完成)。这解决了我的并发问题。然而,GUI 最终在这个过程中被锁定,但这似乎是另一个问题。

于 2012-07-17T21:08:59.943 回答