大部分情况下,GUI界面编程是不用考虑线程问题的,SWT已经帮助我们隐藏了底层的线程调用.

但是一些特殊应用的实现,却不得不涉及SWT线程编程.比如说当进度条的例子(以后要加上,现在还没有做,没有总结).

当开始执行后界面很难再被操作.有一种死机的感觉.这就主要是因为其事件处理占用了整个线程.

在实际项目开发中,一种常见的应用是.单击界面的"实行"按钮后,在后台处理一些超长事件的任务,任务的执行情况要及时反映在界面上,而且还不能影响前台界面的其他操作.

这种应用的实现思路如下:

1.前台界面和后台的程序是分成了两个类.

2.为后台程序另开一个线程,这样就可以让前台界面操作不受后台处理的影响.

3.前台界面提供一些可以操作组件的方法.后台处理程序则调用这些方法将执行情况的字符串写入到前台界面的组件中.(如文本框)

这种思路必须解决一个关键问题:界面本身有一个默认的线程,后台程序又是另外一个线程,那么该如何在一个线程中访问另外一个线程呢?问题的解决方法很简单,仅要记住的两个核心要点如下:

(1)为后台新开一个线程,这要用到JDK中线程的知识.代码示例如下:

new Thread(){//新开一个线程,这是匿名内部类的写法

  public void run(){

  //后台任务......  

  }

}

start();//表示立即启动这个线程

(2)从后台处理线程中访问前台界面组件.关键在于使用Display对象.因为Display主要负责管理实践循环和控制UI线程和其他线程之间的通信.Display的具体使用方法如下:

Display.getDefault().asyncExec(new Runnable(){//这又是一个匿名内部类的写法
    public void run(){
    //对前台界面进行操作
    }
});
在这里Display对象很关键,因此顺便给出得到Display独享的两种方法.
1.Display.getDefault(),得到一个默认的Display对象,应用程序一般只需要一个display对象.
2.Display.getCurrent(),得到当前运行线程所在的Display对象,如果生成了两个以上的Display对象,这可以使用这个方法.

>>>>>>>未完待续>>>>>>>>>>>>>>>>>

SWT线程虽然实现较简单,但是其涉及到的Java多线程编程却是相当复杂的.特别要注意到多线程对变量的影响.具体内容要参照java中的线程内容.

一般情况下,界面开发中不需要去涉及多线程,即使使用也要十分小心.不可以随便大意,要知道多线程引起的BUG是很难查找出来的.

关于SWT的线程问题的更多相关文章

  1. SWT中的多线程(Invalid thread access)

    最近在学习swt的东西,遇到一个问题,特转录如下. SWT异常: org.eclipse.swt.SWTException: Invalid thread access 在创建SWT界面的线程之外的线 ...

  2. org.eclipse.swt.SWTException: Invalid thread access问题解决方法

    转自 http://blog.csdn.net/ecjtuxuan/article/details/2125023 怎么解决SWT多线程错误:Caused by: org.eclipse.swt.SW ...

  3. Java琐记

    svn项目倒入,所选的文件夹一定是src上面以及的:然后eclipse会自动创建一个项目,项目名称就是src上级文件夹的名称:然后会按照路径下的文档结构如导入到eclipse的结构中: 被标记为// ...

  4. JVM垃圾回收(上)

    Java 中的垃圾回收,常常是由 JVM 帮我们做好的.虽然这节省了大家很多的学习的成本,提高了项目的执行效率,但是当项目变得越来越复杂,用户量越来越大时,还是需要我们懂得垃圾回收机制,这样也能进行更 ...

  5. Atitit.swt 线程调用ui控件的方法

    Atitit.swt 线程调用ui控件的方法 1 SwingUtilities.invokeLater1 2 display.asyncExec方法1 3  display.timerExec(500 ...

  6. 关于 SWT 的UI线程和非UI线程

    要理解UI线程,先要了解一下“消息循环”这个概念.链接是百度百科上的条目,简单地说,操作系统把用户界面上的每个操作都转化成为对应的消息,加入消息队列.然后把消息转发给对应的应用程序(一般来说,就是活动 ...

  7. swt进度条 线程

    import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import java.util.Rando ...

  8. swt 更新主UI线程

    // 将msg送回对应的Applet public void write(String msg) { synchronized (msg) { try { m_out.writeUTF(msg); } ...

  9. Java多线程线程学习(一)

    一.操作系统级别的进程与线程1.进程: 一个计算机程序的运行实例.包含了需要执行的指令,有自己的独立地址空间,是互相隔离的.进程拥有各种资源和状态信息,包括打开的文件.子进程和信号处理.2.线程: 表 ...

随机推荐

  1. opencv开发的程序分发给客户时所需要的dll文件

    这里主要讲在其他裸机,没有搭建开发环境机器上运行自己开发的程序. 为了测试,我专门用visualbox搭建了一个虚拟机(主机和虚拟机都是win7系统) 在发给别人程序运行出现错误:msvcp100d. ...

  2. Good practice release jar to Nexus

    Step  suppose you need to develop a feature,when you finish the feature ,you need to release the jar ...

  3. light oj 1214 - Large Division

    1214 - Large Division   PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: 32 MB G ...

  4. 楔子(xiē zǐ)

    戏曲.小说的引子.一般放在篇首,用以点明.补充正文,或者说引出正文或是为正文做铺垫.指旧小说的引子,通常放在小说故事开始之前,起引出或补充正文的作用.这不过是个楔子,下面还有正文.——<儒林外史 ...

  5. NGUI学习笔记(四):动态加载UI和NGUI事件

    动态加载UI 我们进入一个场景后,如果将这个场景所有可能用到的UI都直接放在场景中做好,由于要在进入场景时就部署好所有的UI对象,那么当UI对象较多时会碰到的问题是:1.初始化场景会产生非常明显的卡顿 ...

  6. Oracle- plsql developer如何查询SQL语句执行历史记录

    相信很多在plsql developer调试oracle的朋友,经常会遇到在plsql developer执行的某一条SQL语句没有保存,那么我们在plsql developer下如何找到我们执行过的 ...

  7. MSSQLSERVER数据库- 触发器

    参考了别人写的文章,我删除掉一些废话,只看一些我想看的信息.整理了一下,记录在这里,方便以后查阅! 1.当触发INSERT触发器时,新的数据行就会被插入到触发器表和inserted表中. 2.当触发d ...

  8. Redis 配置文件 Redis.conf 参数说明

    Redis 配置文件 Redis.conf 参数说明 参数名 参数说明 参数实例 daemonize 是否以后台守护进程运行,默认为 no, 取值 yes, no   daemonize no     ...

  9. Android studio中出现非法字符时的部分解决方法

    我将原来在Eclipse中开发的工程搬到了Android studio上来,在运行,编译程序的过程中出现了错误.提示存在非法字符. 后来发现是由于程序代码中有中文字符的出现,问题就出在对中文支持的UT ...

  10. Gitbook 使用入门

    GitBook 是一个基于 Node.js 的命令行工具,可使用 Github/Git 和 Markdown 来制作精美的电子书. 本书将简单介绍如何安装.编写.生成.发布一本在线图书. http:/ ...