2012-07-16 112 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完成)。這解決了我的併發問題。然而,圖形用戶界面在這個過程中被關閉了,但這似乎是另一個問題。

相關問題