gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:55:59 32 4
gpt4 key购买 nike

我见过:

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

我想知道是否真的需要手动检查当前执行线程。如果我无条件使用
PlatformUI.getWorkbench().getDisplay.asyncExec(aRunnable)

Display实现是否仍无法正确处理这两种情况?如果是这样,当将 asyncExec替换为 syncExec时,它还能正确处理吗?

最佳答案

它是从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线程上专门调用 runRunnable方法,则可以对其调度进行更多控制。

当然,从UI线程调用 syncExecasyncExec的行为可能会有所不同。我似乎还记得,从UI线程调用 syncExec时将立即执行,并且 asyncExec始终将其工作排入队列,但是同样,这是实现细节,不能保证。

此外, no 不能将 asyncExec的每个实例替换为 syncExec的实例。 syncExec将等待有问题的可运行对象由UI线程发布和执行,这可能会引起严重的争用问题。想象一下这段代码在非UI线程上运行:
synchronized(foo)
{
display.asynExec(new Runnable() {
public void run()
{
synchronized(foo)
{
System.out.println("Hello!");
}
}
});
}

这是一个简单的例子-但不会死锁。 asyncExec调用将使该可运行对象排队并返回,这将退出 synchronized块,以便UI线程上的可运行对象以后可以获取锁。但是,用 syncExec替换它肯定会死锁。

通常,建议使用 asyncExec,除非您认为需要 syncExec的执行保证。

关于eclipse - 从UI线程调用PlatformUI.getWorkbench()。getDisplay()。syncExec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21385727/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com