2012-07-16 73 views
0

我有一个程序在加载文件的同时我正在显示一个窗口来通知用户该文件正在加载。我决定创建一个FileLoader类,它是一个实际处理加载文件的SwingWorker类和一个实现PropertyChangeListener的ProgressWindow,以通知用户有关传递给它的SwingWorker的状态。在调用另一个方法之前等待SwingWorker.isDone()

我的代码目前看起来是这样的:

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()行。有没有简单的方法来做到这一点?或者就此而言,这是最好的办法吗?

+0

我也尝试把代码放在同步块中:synchronized(this){new ProgressWindow ... doc = loader.getFile}但它没有工作。显然,我误解了问题的性质以及如何解决问题。 – Thunderforge 2012-07-16 21:55:08

+0

我已经做了一些考虑,并考虑让ChangeListener监听加载器完成时(即其状态等于SwingWorker.StateValue.DONE)。但我宁愿不必经历那种麻烦。 – Thunderforge 2012-07-16 22:54:50

+0

我已经尝试在FileLoader的doInBackground()和getFile()方法上放置“synchronized”关键字,但它没有改变。 – Thunderforge 2012-07-16 23:37:41

回答

0

好吧,我找到了我原来的问题的答案,即使出现了另一个问题。我发现我可以从SwingWorker<Void,Void>更改为SwingWorker<File,File>,然后使用内置的get()方法返回文件(自动等待Swingworker完成)。这解决了我的并发问题。然而,图形用户界面在这个过程中被关闭了,但这似乎是另一个问题。

相关问题