2012-07-10 67 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

相关问题