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

swt执行线程

阅读更多
2009年03月30日 星期一 19:24

 

SWT中的多线程机制和awt/swing中有些不同,这个大家应该都知道,不过还是要说下,

Display对象中负责调用其他线程的方法有以下3种:

● asyncExec(Runnable runnable):异步启动新的线程。所谓异步就是,UI线程不会等待runnable对象执行结束后再继续进行,就是说UI线程可以和runnable对象所在的线程同时运行。

● syncExec(Runnable runnable):同步启动新的线程。所谓同步就是,UI线程会等待runnable对象执行结束后才会继续进行,当runnable对象是耗时大的线程时,尽量不要采用此种方式。另外,对于该种方式创建的线程可通过getSyncThread()方法获得线程对象。

● timerExec(int milliseconds,Runnable runnable):指定一段时间再启动新的线程。用此方法创建的线程,将会在指定的时间后再启动线程。当然用此方法创建的线程启动后,与UI线程是异步的。如果指定的时间为负数,将不会按时启动线程。

另外Display对象中,与UI线程相关的方法如下所示:

● 获得当前的UI线程对象的方法:getThread(),返回Thread对象。

● 使UI线程处于休眠状态:sleep()。

● 唤醒UI线程:wake()。

上面几点都是书里面的原话,不做阐述了.下面我要说的是一个写法的问题,不能小瞧啊,后果很严重.

如果有一个线程他要做的事需要很久比如5分钟,像我这样的初学swt的人一定是new了一个线程然后

getDisplay().asyncExec(线程对象); 结果虽然执行成功,但是界面确处于挂起状态(假死),直到执行结束,不过要说的是的确是异步执行的,还是ui却不知道为什么停止用户响应,原理暂时先不去理了,swt源码太复杂了.

这里面就要引出一个问题为什么不 像下面这么写呢?

Thread thread = new Thread(线程对象);
   thread.start();
因为swt中非UI线程中调用窗口控件如果不像上面三种写法那样写的话,会抛

org.eclipse.swt.SWTException: Invalid thread access这个异常

在swt中程序启动时只有一个主线程,在这里与awt和swing是不一样的,它不允许其他线程访问UI主线程中的部件,具读过swt源码的人说AsyncExec方法根本就没有新启动一个线程而是由Synchronizer调用其中的 run 方法而已.如果是这样的话,也就难怪UI会挂起.

解决这个问题的一个比较好的方法是如果要异步执行的线程所做的工作非常少的话,就无所谓了,如果异步线程需要执行很长时间的话,应该像下面这样启动线程

Thread thread = new Thread(线程对象);
   thread.start();

在线程对象里面所有调用到UI部件的地方

classFinder.getGui().getDisplay().syncExec(new Runnable() {
   public void run() {
       //do run
   }
});

历经几个小时问题终于解决了这里做个总结吧.

我对swt多线程的评价

swt的syncExec ,asyncExec 以及timerExec都是伪线程执行方法,把它看成特别的Synchronizer调用就可以了,

syncExec ,asyncExec 以及timerExec执行的线程要做的事只是改变UI部件的属性而已执行时间不能太长.此外的其他操作仍然由传统的线程来做.

这里要特别注意,swt执行线程只用于在传统线程中操作ui组建

在这里要感谢内部类,否则一个复杂的swt线程不知道要写多少个为swt部件服务的标准类

分享到:
评论
1 楼 zhoche2008 2010-07-20  
好文章,解决了我的问题

相关推荐

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

    SWT并发例子(后台耗时线程)前台点击按钮,后台执行一个耗时操作。

    swt-async-handler-1.0

    SWT同样不允许主线程外的其他线程直接访问控件。 所以SWT为我们提供了async执行Runnable的方法。 但是该方法只是用于接收异步线程消息,如果你在该方法中做过多的事情同样会造成UI线程的阻塞。 因此,笔者模仿...

    ScrolledComposite自动出现滚动条

    ScrolledComposite自动出现最适合大小的滚动条代码

    glimmer-dsl-swt:用于SWT的Glimmer DSL(JRuby桌面开发GUI框架)

    适用于SWT 4.18.4.5的Glimmer DSL JRuby桌面开发GUI框架 是用编写的本机GUI跨平台桌面开发库,它是的OS线程更快的JVM版本。 的主要创新是声明性 ,它依靠强大的实现了桌面应用程序用户界面的高效生产。 还通过...

    lw_reptile:图片爬虫-

    作为maven项目导入,可直接执行main方法运行爬虫,然后文件夹bin和config放入lw_reptile目录下。 2.将代码作为可运行的JAR文件进行导出,选择从inio生成的JAR文件中提取所需的库,将其替换为reptile.jar文件。 #...

    jhc:SWTSwingAWT的Java热图窗口小部件控件

    计算是在后台线程中执行的,从而允许在渲染过程中进行耗时的过程,例如访问磁盘。 当按比例缩小热图时,JHC当前使用算术平均值对值进行汇总,并针对这些汇总动态调整规模的最小值和最大值。 在将来的版本中,计划...

    Java项目开发与毕业设计指导

    目前只支持两个客户端进行网络对战,多个玩家还有如线程同步问题等。两个客户端可以在同一台电脑上运行。 Ch04:多媒体展示系统 –网络游鱼 安装JDK、配置环境变量,打开Eclipse导入ch04项目,运行server....

    JAVA上百实例源码以及开源项目

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu  Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,...

    JAVA上百实例源码以及开源项目源代码

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu  Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,...

    java源码包---java 源码 大量 实例

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu  Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,...

    java源码包2

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu  Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到...

    java源码包3

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu  Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到...

    java源码包4

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu  Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不...

Global site tag (gtag.js) - Google Analytics