`
a222aaaa
  • 浏览: 2456 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

SWT 中asyncExec和syncExec的区别

阅读更多
看了很多大神对asyncExec的讲解,对于刚学swt不久的我,显然还是很深奥的。
所以还是自己写了两个例子对比一下,有不对的请指出来
在非ui线程中更新ui,有两种方法
1:asyncExec
2:syncExec

其中两个方法的可以用两个例子看出来:
1.asyncExec 用法实例
protected void createContents() {
     Display.getCurrent().asyncExec(new Runnable() {
             
               @Override
               public void run() {
                    try {
                         System.err.println("开始倒计时了");
                         Thread.sleep(3000);
                    } catch (InterruptedException e1) {
                         //e1.printStackTrace();
                    }
                    System.err.println("倒计时完成");
                  
               }
          });
          new Thread( new Runnable() {
             
               @Override
               public void run() {
                    try {
                         Thread.sleep(500);
                    } catch (InterruptedException e) {
                    }
                    tt = false;
                    System.err.println("循环停止");
                  
               }
          }).start();
        System.err.println("这里不会因为asyncExec而阻塞");
          System.err.println("开始循环");
          while (tt) {
               System.err.println("循环中");
             
          }
}
以上程序的输出为
这里不会因为asyncExec而阻塞
开始循环
循环中
循环中
。。。。
循环中
循环停止
开始倒计时了
倒计时完成

从以上例子可以看出asyncExec实现了一种异步的运行方式,当调用此asyncExec的方法的语句全部运行完成,才会去调用asyncexec方法

2.syncExec实例
protected void createContents() {
     Main.getDisplay().syncExec(new Runnable() {
             
               @Override
               public void run() {
                    try {
                         System.err.println("开始倒计时了");
                         Thread.sleep(3000);
                    } catch (InterruptedException e1) {
                         //e1.printStackTrace();
                    }
                    System.err.println("倒计时完成");
                  
               }
          });
          new Thread( new Runnable() {
             
               @Override
               public void run() {
                    try {
                         Thread.sleep(100);
                    } catch (InterruptedException e) {
                         // TODO Auto-generated catch block
                         e.printStackTrace();
                    }
                    tt = false;
                    System.err.println("循环停止");
                  
               }
          }).start();;
          System.err.println("这里因为syncExec阻塞,要等到倒计时完成之后才会运行");
          System.err.println("开始循环");
          while (tt) {
               System.err.println("循环中");
             
          }
}

以上程序输出如下
开始倒计时了
倒计时完成
这里因为syncExec阻塞,要等到倒计时完成之后才会运行
开始循环
循环中
循环中
。。。。
循环中
循环停止

通过以上例子可以看出syncExec会马上阻塞到ui线程的运行,需要等到syncExec方法内的倒计时完全之后开会开始循环。

但两个方法都是占用ui线程,所以在调用前后台交互,或者包含阻塞方法而不想ui阻塞时,要先新建一个线程,然后完成这个方法,然后再来调用syncexec或asyncexec方法。

new Thread(new Runnable() {

                    @Override
                    public void run() {
                         //这里去请求后台,会卡死噢,但你新建了一个线程所以不会影响到ui界面的运行。
                         final PostDataModel pdm = ControlFactory.login(new Data(GlobalData.userName, GlobalData.userPwd), false);
                         //请求完成了。下面更新ui;
                         Display.getCurrent().asyncExec(new Runnable() {
              
               @Override
               public void run() {
                   //方法体内更新ui,由于只是刷新界面,并没有复杂的业务,所以整个界面都很柔顺
                   
               }
          });

                    }
               }).start();

分享到:
评论

相关推荐

    swt线程冲突与解决

    通过对SWT线程冲突的理解以及对同步调用和异步调用的掌握,我们可以有效地避免在多线程环境中对SWT组件的非法访问,从而提高程序的稳定性和用户体验。在实际开发过程中,根据具体的业务需求选择合适的调用方式是非常...

    swt 多线程

    总结来说,SWT的多线程机制是通过Display类提供的`asyncExec`、`syncExec`和`timerExec`方法来实现的,它们允许开发者在不阻塞UI线程的情况下执行后台任务。理解和熟练运用这些方法是构建高效、响应性强的SWT应用的...

    基于swt的小软件

    例如,使用`Display.asyncExec`或`Display.syncExec`方法在GUI线程中更新界面,确保界面操作的线程安全。 **Bank子文件** 在"Bank"这个子文件中,很可能是实现了一款与银行相关的模拟软件,可能包括账户管理、交易...

    swt源码以及jar

    开发者可以通过`Display.syncExec()`或`Display.asyncExec()`方法在UI线程中执行任务。 除了基本的GUI组件,SWT还提供了许多高级功能,比如对话框(Dialogs)、表格(Table)、树形视图(Tree)、进度条...

    SWT并发例子(后台耗时线程)

    在SWT中,我们可以使用`Display.asyncExec`或`Display.syncExec`方法来在事件调度线程中执行代码,而使用`new Thread()`来创建并启动新的后台线程来执行耗时任务。以下是一个基本的示例: ```java Button button = ...

    java SWT编写的截图程序

    7. **异步执行:** 图像处理可能会消耗一定时间,因此通常在后台线程(通过`Display.asyncExec()`或`Display.syncExec()`)执行,以避免阻塞UI。 **SWT截图程序的优势:** 1. **原生体验:** SWT直接调用操作系统...

    SWT综合教程及安装指导

    2. 回调机制:使用`Display.asyncExec`或`Display.syncExec`方法来确保在EDT中执行代码。 3. 异步任务:为了执行耗时操作,通常会创建后台线程,完成后通过回调更新GUI。 三、布局管理 1. 布局(Layout):SWT...

    swt

    通常,使用Display.asyncExec()和Display.syncExec()方法来确保在正确的线程(即UI线程)中更新界面元素,防止出现线程安全问题。 **学习资源:** 博文链接提到的是一个关于SWT的博客文章,可能包含一些实用的示例...

    SWT应用的开发实例:没有使用到OSGi

    为了实现程序的逻辑,还需要使用`Thread`或者`Display.asyncExec`、`Display.syncExec`来处理异步任务,确保GUI更新的正确性和响应性。 在没有使用OSGi的情况下,开发者需要自行管理类的加载和依赖关系。这可能意味...

    SWT API 资料

    为了实现异步处理,可以使用`Display.asyncExec`和`Display.syncExec`方法,它们能够在正确的线程上下文中执行回调。 ### 9. 高级特性 SWT还提供了许多高级特性,如拖放支持、打印功能、数据库访问、国际化和本地...

    Graphics Moving Package

    7. **动画框架**:虽然SWT没有内置的动画框架,但开发者可以自定义实现,例如通过使用`Display.syncExec`或`Display.asyncExec`来在 SWT 线程中更新图形状态,实现平滑的动画效果。 8. **布局管理**:SWT 提供了...

Global site tag (gtag.js) - Google Analytics