org.eclipse.swt.SWTException: Invalid thread access问题解决

SWTException在Eclipse插件开发中是比较常见的异常,初遇之时,比较头疼,现将解决办法总结一下。

RootCause

Eclipse是基于SWT框架的。SWT实现了一个被称为单元线程(apartment threading)的UI模型,SWT严格要求UI操作只能由UI线程调用,如果用户企图在非UI线程中访问SWT组件,就会收到“org.eclipse.swt.SWTException: Invalid thread access”异常。

解决方案

SWT为了兼顾非UI线程中对UI组件的访问,提供了以下两种方式(也是唯一的两种方式):

  • syncExec(Runnable runnable)
    这样导致非UI线程等待runnable完成

  • asyncExec(Runnable runnable)
    允许非UI线程继续执行而非等待runnable完成

    display.syncExec(
      new Runnable() {
      public void run(){
        label.setText(text);
      }
    });
    
举例

比如,在某个线程的回调方法中,需要弹出对话框提示用户,可以这样做:

public void callback() {

    Display.getDefault().syncExec(new Runnable() {
        @Override
        public void run() {
            MessageDialog.openError(getShell(),
                    "title","Error!");
        }
    });
}

这里使用的是同步调用,当然还有异步方式可用,但SWT推荐使用前者,因为这样更接近java方法调用(即获得结果前总是等待method执行完毕)。

此外,Display还有个getCurrent()可用,实际编码时可根据情况选择之。

Reference

The SWT FAQ

(end)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,742评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,224评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,671评论 18 399
  • 下面是我自己收集整理的Java线程相关的面试题,可以用它来好好准备面试。 参考文档:-《Java核心技术 卷一》-...
    阿呆变Geek阅读 15,034评论 14 507
  • 今天成都的天气好到让人神清气爽~虽然是周一,依然阻挡不了图大美丽的心情哦,谁让我的新包包实在太美! 出门太匆忙,忘...
    图大人阅读 3,602评论 2 1

友情链接更多精彩内容