gpt4 book ai didi

java - 将 Display.syncExec 期间捕获的异常传播到调用线程

转载 作者:太空宇宙 更新时间:2023-11-04 08:06:46 27 4
gpt4 key购买 nike

我已经见过几次但仍然不确定它是否正确的模式:我需要通过 Display.syncExec 在 SWT UI 线程上调用一些代码。在 UI 线程中运行的代码捕获已检查的异常,并希望将此异常传播到等待线程。该模式如下所示:

SomeCheckedException[] exc = new SomeCheckedException[] { null };
display.syncExec(new Runnable(){
public void run(){
try {
new Work().something();
} catch (SomeCheckedException e){
exc[0] = e;
}
}
});

if (exc[0] != null){
//..
}

即使这里没有真正的并发,我仍然认为这在可见性方面并不是真正安全:很可能 UI 线程存储了一个异常,但调用线程不会看到这个,并且在再次控制后访问数组时仍然读取“null”。我对吗?那么最好的方法是捕获 SWTException 并通过 instanceof 检查其可抛出字段吗?编辑:嗯,如果它是一个受检查的异常,那就不会那么容易了。我需要自己从 catch block 中抛出 SWTException 。更好的解决方案?

感谢您的帮助和评论。

最佳答案

就是这种情况AtomicReference是为:

  void foo() throws SomeCheckedException {
final AtomicReference<SomeCheckedException> exRef = new AtomicReference<>();
display.syncExec(new Runnable() {
public void run() {
try {
new Work().something();
} catch (SomeCheckedException e) {
exRef.set(e);
}
}
});
SomeCheckedException ex = exRef.get();
if (ex != null) {
throw ex;
}
}

关于java - 将 Display.syncExec 期间捕获的异常传播到调用线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11951336/

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