SWT异常: Invalid thread access

本文介绍了在使用SWT框架时如何避免因跨线程修改界面元素而引发的线程安全问题。通过展示具体的代码示例,解释了如何正确地使用`syncExec`和`asyncExec`方法来确保界面更新操作在用户界面线程中执行。
SWT:程序中开启了一个线程,要改变界面,抛出: org.eclipse.swt.SWTException: Invalid thread access

在创建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() {

                  
// 你改界面的代码

             }

             };

       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.

附例参考:

 public void loginComplete(MsnFriend own) {
    Display.getDefault().syncExec(new Runnable() {
    public void run() {

   //需要修改界面的代码
    allTxt.setText("登录成功....");
    }
    }); 
   }

 

 

注:转摘。感谢提供帮助给大家的所有朋友。

分析下面的报错 !ENTRY org.eclipse.ui.console 4 2 2025-08-27 18:44:27.458 !MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.ui.console". !STACK 0 org.eclipse.swt.SWTException: Invalid thread access at org.eclipse.swt.SWT.error(SWT.java:4397) at org.eclipse.swt.SWT.error(SWT.java:4312) at org.eclipse.swt.SWT.error(SWT.java:4283) at org.eclipse.swt.widgets.Widget.error(Widget.java:472) at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:363) at org.eclipse.swt.widgets.Control.redraw(Control.java:2347) at org.eclipse.swt.custom.StyledText.redraw(StyledText.java:7354) at org.eclipse.ui.console.TextConsolePage.propertyChange(TextConsolePage.java:252) at org.eclipse.ui.console.AbstractConsole$PropertyNotifier.run(AbstractConsole.java:104) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.ui.console.AbstractConsole$PropertyNotifier.notify(AbstractConsole.java:120) at org.eclipse.ui.console.AbstractConsole.firePropertyChange(AbstractConsole.java:246) at org.eclipse.ui.console.IOConsoleOutputStream.setColor(IOConsoleOutputStream.java:140) at tibon.TibrvSend.<init>(TibrvSend.java:318) at tibon.TibrvSend.<init>(TibrvSend.java:326) at tibon.TibrvSend.send(TibrvSend.java:265) at tibon.TibrvSend.send(TibrvSend.java:281) at tibon.actions.SendDelegate$Sender.run(SendDelegate.java:139) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53) !ENTRY org.eclipse.ui.console 4 120 2025-08-27 18:44:27.459 !MESSAGE Exception occurred during console property change notification. !STACK 0 org.eclipse.swt.SWTException: Invalid thread access at org.eclipse.swt.SWT.error(SWT.java:4397) at org.eclipse.swt.SWT.error(SWT.java:4312) at org.eclipse.swt.SWT.error(SWT.java:4283) at org.eclipse.swt.widgets.Widget.error(Widget.java:472) at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:363) at org.eclipse.swt.widgets.Control.redraw(Control.java:2347) at org.eclipse.swt.custom.StyledText.redraw(StyledText.java:7354) at org.eclipse.ui.console.TextConsolePage.propertyChange(TextConsolePage.java:252) at org.eclipse.ui.console.AbstractConsole$PropertyNotifier.run(AbstractConsole.java:104) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.ui.console.AbstractConsole$PropertyNotifier.notify(AbstractConsole.java:120) at org.eclipse.ui.console.AbstractConsole.firePropertyChange(AbstractConsole.java:246) at org.eclipse.ui.console.IOConsoleOutputStream.setColor(IOConsoleOutputStream.java:140) at tibon.TibrvSend.<init>(TibrvSend.java:318) at tibon.TibrvSend.<init>(TibrvSend.java:326) at tibon.TibrvSend.send(TibrvSend.java:265) at tibon.TibrvSend.send(TibrvSend.java:281) at tibon.actions.SendDelegate$Sender.run(SendDelegate.java:139) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)
最新发布
08-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值