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)

你可能感兴趣的:(org.eclipse.swt.SWTException: Invalid thread access问题解决)