gpt4 book ai didi

eclipse - 在 Eclipse 中从 asyncExec 获取返回值的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-01 22:25:50 25 4
gpt4 key购买 nike

我正在编写 Eclipse 插件,经常遇到这样的情况:正在运行的作业需要暂停一小会儿,在 UI 线程上异步运行某些内容,然后恢复。

所以我的代码通常看起来像这样:

Display display = Display.getDefault();
display.syncExec(new Runnable() {
public void run() {
// Do some calculation
// How do I return a value from here?
}
});
// I want to be able to use the calculation result here!

一种方法是让整个 Job 类都有一些字段。另一种方法是使用自定义类(而不是匿名类并使用其结果数据字段等)。最好、最优雅的方法是什么?

最佳答案

我认为上面的容器是“正确”的选择。它也可以被泛化以实现类型安全。在这种情况下,快速的选择是最终的数组习惯用法。技巧是从 Runnable 引用的任何局部变量都必须是最终的,因此不能被修改。因此,您可以使用单元素数组,其中数组是最终数组,但可以修改数组的元素:

final Object[] result = new Object[1];
Display display = Display.getDefault();
display.syncExec(new Runnable()
{
public void run()
{
result[0] = "foo";
}
}
System.out.println(result[0]);

同样,对于您有匿名类并且希望为其提供一个位置来粘贴结果而不定义特定容器类的情况,这是“快速”解决方案。

更新在我思考了一下之后,我意识到这对于回调位于同一线程中的监听器和访问者类型的使用效果很好。然而,在这种情况下,Runnable 在不同的线程中执行,因此不能保证您在syncExec 返回后实际看到结果。正确的解决方案是使用 AtomicReference:

final AtomicReference<Object> result = new AtomicReference<Object>();
Display display = Display.getDefault();
display.syncExec(new Runnable()
{
public void run()
{
result.set("foo");
}
}
System.out.println(result.get());

保证对 AtomicReference 值的更改对所有线程都可见,就像它被声明为 volatile 一样。这个有详细描述here .

关于eclipse - 在 Eclipse 中从 asyncExec 获取返回值的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/354796/

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