——此文章摘自《自己动手写开发工具基于Eclipse的工具开发》定价¥特价¥ 详细>> 在非用户线程中对用户线程的GUI资源进行访问的时候如果不进行同步的话就会造成不可预料的问题AWT/Swing中并没有强制在非用户线程中访问用户线程的GUI资源的时候要进行同步而SWT则进行了同步控制这样就可以预防这些不可预料的问题在SWT中通常存在一个被称为用户线程的唯一线程只有在这个线程中才能调用对组件或某些图形 API的访问操作如果在非用户线程中程序直接调用这些访问操作那么SWTExcepiton异常会被抛出 下面看一个例子 Runnable r = new Runnable() { public void run() { for (int i = ; i < ; i++) { try { wait(); } catch (InterruptedException e) { } textsetText(new Integer(i)toString()); } } }; 我们启动一个线程在这个线程中每隔一秒为界面文本控件赋值一次运行后就会抛出SWT异常 解决这个问题的方法也是非常简单的那就是通过Display类的syncExec(Runnable)和asyncExec(Runnable)这两个方法去实现 Runnable r = new Runnable() { public void run() { for (int i = ; i < ; i++) { try { wait(); } catch (InterruptedException e) { } final int j = i; displayasyncExec(new Runnable() { public void run() { textsetText(new Integer(j)toString()); } }); } } }; 方法syncExec()和asyncExec()的区别在于前者要在指定的线程执行结束后才返回而后者无论指定的线程是否执行都会立即返回到当前线程 |