大部分情况下,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. C#递归遍历指定目录下文件和文件夹

    #region 使用递归查询某路径中的文件结构 public static void CheckFilePath() { ReadFilePath(); } public static void Re ...

  2. 设计模式_Facade_门面模式

    形象例子: 我有一个专业的Nikon相机,我就喜欢自己手动调光圈.快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会.幸好相机有Facade设计模式,把相机调整到自动档,只要对准目标按快门 ...

  3. js,css压缩工具

    常见的js压缩工具: js commpress: 运行平台:windows系统, 优点:能自动压缩: 缺点:不能拖动文件压缩:只支持windows平台: s.press 运行平台:mac ox系统 优 ...

  4. Android 依赖注入 ButterKnife 基本使用

    ButterKnife 是一个快速 Android View 注入框架,开发者是Jake Wharton,简单的来说,ButterKnife 是用注解的方式替代findViewById和setXXXL ...

  5. leetcode@ [91] Decode Ways (Dynamic Programming)

    https://leetcode.com/problems/decode-ways/ A message containing letters from A-Z is being encoded to ...

  6. 说说QQ空间SEO

    其实这个话题由来已久,已经有很多大神做到QQ空间日访问量破万,甚至更多了,卖产品卖到抽筋儿. 怎么说QQ空间SEO,其实不如说QQ空间引流更合适,因为QQ空间与QQ的特殊关系,SEO貌似不是很重要,其 ...

  7. 第九章、文件与文件系统的压缩与打包 3. 打包命令: tar

    打包命令: tar gzip 与 bzip2 也能够针对目录来进行压缩, 不过,这两个命令对目录的压缩指的是『将目录内的所有文件 "分别" 进行压缩』! 将多个文件或目录包成一个大 ...

  8. MYSQL- 创建和删除临时表

    临时表可能是非常有用的,在某些情况下,保持临时数据.最重要的是应该知道的临时表是,他们将当前的客户(www.111cn.net)端会话终止时被删除 当你创建临时表的时候,你可以使用temporary关 ...

  9. Python中如何把一个UTC时间转换为本地时间

    需求: 将20141126010101格式UTC时间转换为本地时间. 在网上搜了好长时间都没有找到完美的解决方案.有的引用了第三方库,这就需要在现网安装第三方的软件.这个是万万不可的.因为真实环境不一 ...

  10. iOS开发-表视图的使用

    // // ViewController.m // Simple Table // // Created by Jierism on 16/7/20. // Copyright © 2016年 Jie ...