在我的SWT Java应用程序中,我经常想从Display.syncExec()调用中返回信息。 到目前为止,我发现这样做的最好方法是:

final ArrayList<Integer> result = new ArrayList<Integer>();
GUI.display().syncExec(new Runnable(){ public void run() {
   MessageBox mb = /* ... */;
    /* set up messagebox */
   result.add(mb.open());
}});
if (SWT.OK == result.get(0)) { /* ... */ }

我认为这是允许的,因为ArrayList是线程安全的,但是我应该使用更好的容器,还是更简单的方法?

===============>>#1 票数:5 已采纳

ArrayList不是线程安全的 您可以使用Collections.synchronizedList获取线程安全的List 但是,在更常见的情况下,在您的案例或AtomicReference中使用AtomicInteger要简单得多。

final AtomicInteger resultAtomicInteger = new AtomicInteger();
Display.getCurrent().syncExec(new Runnable() { 
    public void run() {
        MessageBox mb = /* ... */;
            /* set up messagebox */
        resultAtomicInteger.set(mb.open());
}});
if (SWT.OK == resultAtomicInteger.get()) { /* ... */ }

===============>>#2 票数:3

我刚刚解决了这个问题,我的第一次尝试是类似的 - 数组或所需类型项的列表。 但过了一段时间我做了这样的事情:

abstract class MyRunnable<T> implements Runnable{
    T result;
}
MyRunnable<Integer> runBlock = new MyRunnable<Integer>(){
   MessageBox mb = /* ... */;
    /* set up messagebox */
   result = mb.open();
}
GUI.display().syncExec(runBlock);
runBlock.result; //holds a result Integer

它更加整洁并消除了冗余变量。

BTW。 我真正的第一次尝试是使用UIThreadRunnable,但我不想要SWTBot依赖,所以我放弃了这个解决方案。 在我找到自己的解决方案后,我发现,他们在那里使用类似的工作。

===============>>#3 票数:1

如果经常发生这种情况,最好在进程和视图之间使用subscribe / notify模型。 您的视图订阅了应触发该消息框的事件,并在满足条件时收到通知。

===============>>#4 票数:1

ArrayList 不是线程安全的。 来自相关的Javadoc

请注意,此实现不同步。 如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改了列表,则必须在外部进行同步。

如果需要List的线程安全实现,JDK中提供了(至少)两个:CopyOnWriteArrayList和Vector。

===============>>#5 票数:1

您可以使用Integer [1]数组使其更简洁,但我认为它不能直接从匿名内部类中更新非final变量。

final Integer[] result = new Integer[1];

我认为您必须将结果声明为final(但该更改不会影响您的代码)。 由于当前线程阻塞直到内部线程完成,我认为您不必担心同步(但您可能需要使变量违反,以便您看到结果)。

  ask by magpulse translate from so

未解决问题?本站智能推荐:

1回复

Eclipse SWT:从同步方法调用的Display.syncExec()

我有一个自定义日志,该日志获取由后台线程或由用户鼠标单击事件触发的主线程打印的数据。 这两个线程可以同时在日志上打印。 代码是这样的 方法setInputLines(),updateConsole()和printConsole()未定义为已同步。 方法updateConsole()
1回复

Java SWT-将数据从组件返回到其他线程的最佳方法

我有一个Java SWT应用程序,该应用程序运行一个单独的线程(而不是UI)来连接到聊天服务器。 如果我想从连接线程更新UI的组件,则可以轻松地做到这一点: 我的问题是我找不到从UI线程上的组​​件获取数据的好方法。 一个例子就是尝试在我的连接线程中创建一个方法,以提取输入到UI线程
3回复

学习线程-仅在另一个方法完成后才运行方法

在执行按钮时,我正在调用2个方法。 startPrinterListOperation(); 需要一些时间才能完成其任务。 但是我不想要方法showAplotPlotterDialog(); 运行直到第一个完成。 因此,我正在尝试使用线程管理来实现这一目标。 这是我尝试过的。
1回复

SWT使用线程填充GUI小部件的正确方法?

我遇到了一个艰难的时期,试图找到一种方法来正确填充需要一些时间的SWT GUI元素(即:我不希望它挂起APP)。 目前,我正在这样做,但是我觉得必须有一个更好的方法。 我必须这样做的原因是: 我需要一个在后台运行并设置一些小部件的任务 您必须始终通过显示的asyncEx
3回复

使用实例变量java进行多线程处理

我有一个类, 上面的类编译得很好。 但是在运行时,系统会在system.out.println()中抛出错误,说“无效的线程访问”。 代码中是否有任何错误。 不允许在多线程中访问实例变量? 有没有办法访问线程内的实例变量? 提前致谢。 编辑新:重现问题 上
1回复

通过侦听SWT浏览器更改来运行映射的Java方法

我在Java项目中使用了SWT Eclipse浏览器。 我创建了测试页面,如下所示: onchange="setTime();fieldChanged();" 这意味着Javascript方法调用。 setTime()在页面上, fieldChanged()以Java代码映射。
2回复

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

我见过: 我想知道是否真的需要手动检查当前执行线程。 如果我无条件使用 Display实施是否仍无法正确处理这两种情况? 如果是这样,当将asyncExec替换为syncExec时,它还能正确处理吗?
2回复

在syncExec块内部和外部使用变量的最简单方法(或者,如何在不初始化的情况下存储对对象的最终引用)

在此示例中,我成功地使用了AtomicReference (我发现这第一件事是syncExec并且可读),但是由于我还使用了syncExec并且直到该块执行完之后,才能访问sync块之外的部分。确实需要引用是原子的。 似乎太过分了。 我尝试使用常规引用,但无法正常工作: 它输出
2回复

syncExec()的SWT问题

这是我在StackOverflow上的第一个问题(抱歉我的英文)。 我会尽力解释这个问题。 我有一个带有前景玉应用程序的swt应用程序,其中我有一个进度条来通知应用程序的持续时间。 要刷新此进度条,我使用: 进展是: 我尝试分析这个Runnable所花费的时间并且它是常
1回复

使用SWT Eclipse的线程,同时以递归方法访问UI

我有一个像这样的递归方法: 我的updateModel方法冻结了UI,所以我尝试使用Job,但是我的问题是我只希望对选中的TreeItem执行更新模型,并且更新模型应该遵循选中的TreeItems的顺序。 如果使用Job,则无法控制首先处理哪个Checked TreeIem。 我也尝