我有一个程序,我正在加载文件,同时我正在显示一个窗口,通知用户文件正在加载。我决定创建一个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()行。有一个简单的方法吗?或者就此而言,这是最好的方法吗?
答案 0 :(得分:0)
好吧,即使出现了另一个问题,我找到了原始问题的答案。我发现我可以从SwingWorker<Void,Void>
更改为SwingWorker<File,File>
然后使用内置的get()方法返回File(它会自动等待直到Swingworker完成)。这解决了我的并发问题。然而,GUI在这个过程中被锁定了,但这似乎是另一个问题。