大部分情况下,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. WebOb的简单介绍

    在之前的文章中我写了有关于如何使用PasteDeploy生成WSGI的Application.在Openstack的源码中,除了 PasteDeploy外,还有一个和WSGI密切相关的工具包WebOb ...

  2. ZOJ3469 Food Delivery 区间DP

    题意:有一家快餐店送外卖,现在同时有n个家庭打进电话订购,送货员得以V-1的速度一家一家的运送,但是每一个家庭都有一个不开心的值,每分钟都会增加一倍,值达到一定程度,该家庭将不会再订购外卖了,现在为了 ...

  3. C语言简短程序gcc编译过程

    一.建立一个×.c源文件.这里起名:rocks.c 二.编辑源代码,在c源文件内输入如下代码: #include <stdio.h> int main() { puts("C R ...

  4. 【原创】lua的module的一些点

    lua的module好像是5.1开始有的 在xx.lua的开头写上 module('my_module') 这行等价于如下几行 local name = 'my_module' local M = { ...

  5. 【HBase学习】Apache HBase项目简介

    原创声明:转载请注明作者和原始链接 http://www.cnblogs.com/zhangningbo/p/4068957.html       英文原版:http://hbase.apache.o ...

  6. javascript操作注册表

    try{                     var shell = new ActiveXObject("WScript.Shell"); //读注册表值var  key1  ...

  7. hql注意事项一

    Space is not allowed after parameter prefix ':' [from EmPaperCatalogDef e where e.parentId =: pcdId]

  8. 解决eclipse 使用run运行,始终会跳到debug模式!

    查看此选项是否选择中卫always,若是,更改为never或prompt,重启eclipse即可

  9. Java编程 -- 命名规范

    转自:http://www.hawstein.com/posts/google-java-style.html#Naming 命名约定 5.1 对所有标识符都通用的规则 标识符只能使用ASCII字母和 ...

  10. go strings 常用的几个函数

    fmt.Println(strings.ToUpper("hello world")) //转换为大写    fmt.Println(strings.ToLower("H ...