eclipse - 从 UI 线程调用 PlatformUI.getWorkbench().getDisplay().syncExec

标签 eclipse multithreading swt

我见过:

if (Display.getCurrent() == null){
   PlatformUI.getWorkbench().getDisplay.asyncExec(aRunnable)
} else {
   aRunnable.run();
}

我想知道是否真的需要手动检查当前执行线程。如果我无条件使用

PlatformUI.getWorkbench().getDisplay.asyncExec(aRunnable)

显示实现无论如何都不能正确处理这两种情况吗?如果是这样,当将 asyncExec 替换为 syncExec 时,它是否也会正确处理它?<​​/p>

最佳答案

它是从 UI 线程调用时 syncExecasyncExec 如何操作的实现细节。 documentation状态:

Causes the run() method of the runnable to be invoked by the user-interface thread at the next reasonable opportunity.

这意味着您的 Runnable 可以简单地放入队列中并在下一个调度循环中执行,可能位于其他 Runnable 之后。如果您在 UI 线程上专门调用 Runnablerun 方法,那么您可以更好地控制其调度。

当然,从 UI 线程调用时,syncExecasyncExec 的行为可能会有所不同。我似乎记得 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/

相关文章:

java - Eclipse Neon 版本中缺少 org.eclipse.equinox.weaving.aspectj?

java - Eclipse:有没有快捷键实现 "Fill method arguments and show guessed arguments"的功能

java - 如何在 Jena 中创建自定义的内置函数?

c - 为什么openmp 32线程比1线程慢得多?

java - 当我在单独的线程(实现 Runnable)上运行该类时,为什么会得到 "android.os.NetworkOnMainThreadException"?

java - 在 TreeViewer 中选择节点

eclipse - org.eclipse.swt.SWTError : Item not added

Eclipse PDE : How to programmatically detect the auto-build process

java - 了解java线程中的 "priority"

java - 如何清除 SWT ExpandBar 的背景?