Java 在调用另一个方法之前等待SwingWorker.isDone()

Java 在调用另一个方法之前等待SwingWorker.isDone(),java,synchronization,swingworker,Java,Synchronization,Swingworker,我有一个程序,在加载文件的同时显示一个窗口,通知用户正在加载文件。我决定创建一个FileLoader类,它是一个实际处理加载文件的SwingWorker,以及一个实现PropertyChangeListener的ProgressWindow,以通知用户传递给它的SwingWorker的状态 我的代码当前如下所示: FileLoader loader = new FileLoader(filePath); new ProgressWindow(loader, "Loading File", "Lo

我有一个程序,在加载文件的同时显示一个窗口,通知用户正在加载文件。我决定创建一个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(),然后运行它的东西直到任务完成。我本来希望在上面的代码继续运行之前完成所有操作,但是当加载程序的execute方法运行时,它会继续运行,从而导致竞争条件


我试过阅读Java同步的内容,但是我很难理解它。我要做的就是等待FileLoader的isDone()方法返回true,然后继续执行loader.getFile()行。有没有简单的方法?或者说,这是最好的方法吗?

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

我还尝试将代码放入同步块:Synchronized(this){new ProgressWindow…doc=loader.getFile},但它不起作用。显然,我误解了问题的本质以及如何解决它。我对此做了一些思考,并考虑在加载程序完成时制作一个ChangeListener来侦听(即,其状态等于SwingWorker.StateValue.done)。但我不想经历这样的麻烦。我尝试过在FileLoader的doInBackground()和getFile()方法中都添加“synchronized”关键字,但没有任何区别。我似乎已经通过在添加“this.notify();”的同时保留“synchronized”关键字解决了竞争条件问题在doInBackground的末尾,如果isDone()为false,则在getFile()方法中调用this.wait()。问题在于wait()方法似乎阻止了Swing窗口的绘制,从而破坏了整个目的。