我见过:
if (Display.getCurrent() == null){
PlatformUI.getWorkbench().getDisplay.asyncExec(aRunnable)
} else {
aRunnable.run();
}
我想知道是否真的需要手动检查当前执行线程。如果我无条件使用
PlatformUI.getWorkbench().getDisplay.asyncExec(aRunnable)
显示实现无论如何都不能正确处理这两种情况吗?如果是这样,当将 asyncExec
替换为 syncExec
时,它是否也会正确处理它?</p>
最佳答案
它是从 UI 线程调用时 syncExec
或 asyncExec
如何操作的实现细节。 documentation状态:
Causes the run() method of the runnable to be invoked by the user-interface thread at the next reasonable opportunity.
这意味着您的 Runnable
可以简单地放入队列中并在下一个调度循环中执行,可能位于其他 Runnable
之后。如果您在 UI 线程上专门调用 Runnable
的 run
方法,那么您可以更好地控制其调度。
当然,从 UI 线程调用时,syncExec
和 asyncExec
的行为可能会有所不同。我似乎记得 syncExec
在从 UI 线程调用时会立即执行,并且 asyncExec
将始终对其工作进行排队,但同样,这是一个实现细节,不能保证.
此外,不,您不能将每个 asyncExec
实例替换为 syncExec
实例。 syncExec
将等待 UI 线程发布并执行有问题的可运行对象,这可能会造成严重的争用问题。想象一下这段代码在非 UI 线程上运行:
synchronized(foo)
{
display.asynExec(new Runnable() {
public void run()
{
synchronized(foo)
{
System.out.println("Hello!");
}
}
});
}
这是一个简单的例子 - 但它不会死锁。 asyncExec
调用会将这个可运行对象排队并返回,这将退出 synchronized
block ,以便 UI 线程上的可运行对象稍后可以获得锁。但是,用 syncExec
替换它肯定会死锁。
一般来说,建议使用 asyncExec
,除非您认为需要 syncExec
提供的执行保证。
关于eclipse - 从 UI 线程调用 PlatformUI.getWorkbench().getDisplay().syncExec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21385727/