2012-07-10 27 views
0

我想在閱讀excel文件時顯示進度。我共享一個Object,它包含最大行號和讀取的最後一行數。 每隔150行將值保存在我的對象中,我將其放入等待狀態,並停止讀取,直到對象解鎖。爲什麼Object#等待不是Display.asyncExec或Display.asyncExec的「合理機會」?

在我的對話窗口中,我嘗試使用syncExec或asyncExec方法更新ProgressBar,並在Object中使用值。對象在調用方法後立即解鎖。

我知道那些方法正在等待最適合的場合來運行runnables。然而,我似乎不明白的是,爲什麼這些方法不被執行,如果沒有任何運行時,他們被稱爲?

我的實際情況是,asyncExec僅在讀取過程結束時更新ProgressBar,而synExec掛起應用程序,因爲它在對象#等待運行時無法執行。

感謝您的閱讀並感謝您的回答。

回答

2

當你的runnable到達事件循環隊列的頭部時,下一個合理的機會就會發生。事件循環會一直運行,同時有可運行的數據在其中等待。我懷疑你正在死鎖事件循環的線程。

+0

這是讀取Excel中的對象有一個'FileDialog'選擇文件。因此,我不得不用'Display.syncExec'來調用它,並且實際上是對事件循環的線程進行了死鎖。 – ArtiBucco 2012-07-10 10:19:06

1

而不是使用的等待,嘗試使用從java.util.concurrent的包CountDownLatch。

2.根據所做的工作更新進度條。

3.我希望你一次只能讀一張excel表格。因此只需要設置1個計數器即可設置CountDownLatch的

由於Excel工作表的讀數完成,計數器變爲0,之後的await()方法的代碼將執行。其在這裏你會關閉該對話框。

檢查此鏈接:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html

+0

+1!我喜歡你的解決方案,它很乾淨,易於使用。 – ArtiBucco 2012-07-10 10:22:21

相關問題