SWTException: Invalid thread access解决方法总结

发表于: java/j2ee | 作者: darkmi | 日期: 2013/06/02 08:00
字号:

在创建SWT界面的线程之外的线程中尝试去修改界面元素.将抛出以下异常

Exception in thread “Thread-0” org.eclipse.swt.SWTException: Invalid thread access

at org.eclipse.swt.SWT.error(SWT.java:2942)

at org.eclipse.swt.SWT.error(SWT.java:2865)

at org.eclipse.swt.SWT.error(SWT.java:2836)

上述Thread-0是另外开启的一个线程.

【解析】:

在SWT程序中,SWT会自动创建一个用户界面线程,非用户界面线程不能直接操作用户界面线程,要想在另外一个线程中尝试修改用户界面,应采用一下方法:

if (!this.display.isDisposed()) {

//首先创建一个单独的线程用来修改界面元素

Runnable runnable = new Runnable() {

public void run() {

// 你改界面的代码

}

};

//通过syncExec方法来执行上一步创建的线程

display.syncExec(runnable);

}

swt-doc中的说明:

public void syncExec(java.lang.Runnable runnable)

Causes the run() method of the runnable to be invoked by the user-interface thread at the next reasonable opportunity. The thread which calls this method is suspended until the runnable completes.

Parameters:

runnable - code to run on the user-interface thread.

同步调用,需要等待主界面处理完成之后,才能继续。

此外,与之对应的另一个方法:

public void asyncExec(java.lang.Runnable runnable)

Causes the run() method of the runnable to be invoked by the user-interface thread at the next reasonable opportunity. The caller of this method continues to run in parallel, and is not notified when the runnable has completed.

Parameters:

runnable - code to run on the user-interface thread.

异步调用,不等待主界面线程处理结果。

[整理自网络]

切换主题切换主题
返回顶部