Java 为什么对象“等待不是一个”;“合理的机会”;用于Display.asynceec或Display.asynceec?

Java 为什么对象“等待不是一个”;“合理的机会”;用于Display.asynceec或Display.asynceec?,java,multithreading,swt,Java,Multithreading,Swt,我试图在阅读excel文件时显示进度。我共享一个对象,该对象包含读取的最大行号和最后一个行号。 我在对象中每隔150行保存一次值,将其置于等待状态,并停止读取,直到对象解锁 在我的对话框窗口中,我尝试使用syncExec或asyncExec方法使用对象中的值更新ProgressBar。在调用方法之后,对象被解锁 我知道这些方法正在等待最“合适”的时机在那里运行。然而,我似乎不明白的是,如果在调用这些方法时没有运行任何东西,为什么这些方法不会被执行 我的实际情况是,asyncExec仅在读取过程结

我试图在阅读excel文件时显示进度。我共享一个对象,该对象包含读取的最大行号和最后一个行号。 我在对象中每隔150行保存一次值,将其置于等待状态,并停止读取,直到对象解锁

在我的对话框窗口中,我尝试使用syncExec或asyncExec方法使用对象中的值更新
ProgressBar
。在调用方法之后,对象被解锁

我知道这些方法正在等待最“合适”的时机在那里运行。然而,我似乎不明白的是,如果在调用这些方法时没有运行任何东西,为什么这些方法不会被执行

我的实际情况是,asyncExec仅在读取过程结束时更新ProgressBar,而synExec挂起应用程序,因为它无法在Object#wait运行时执行


感谢阅读并感谢您的回答。

下一个合理的机会发生在您的runnable到达事件循环队列的头部时。事件循环一直在运行,而其中有可运行程序在等待。我怀疑您正在死锁事件循环的线程。

下一个合理的机会发生在您的runnable到达事件循环队列的头部时。事件循环一直在运行,而其中有可运行程序在等待。我怀疑您正在死锁事件循环的线程。

1。请尝试使用java.util.concurrent包中的倒数锁存器,而不是使用wait

2.根据完成的工作更新进度条

3.我希望您一次只阅读一张excel表格。因此,让倒计时锁存器只设置一个计数器。

4。读取excel工作表后,计数器变为0,将执行wait()方法后的代码。。此时您将关闭该对话框。

检查此链接:


1.不要使用wait,而是尝试使用java.util.concurrent包中的倒计时闩锁

2.根据完成的工作更新进度条

3.我希望您一次只阅读一张excel表格。因此,让倒计时锁存器只设置一个计数器。

4。读取excel工作表后,计数器变为0,将执行wait()方法后的代码。。此时您将关闭该对话框。

检查此链接:


读取excel的对象有一个
文件对话框
来选择文件。因此,我不得不用Display.syncExec调用它,实际上我正在死锁事件循环的线程。读取excel的对象有一个
FileDialog
来选择文件。因此,我不得不用Display.syncExec调用它,实际上我是在死锁事件循环的线程。