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部件服务的标准类
相关推荐
在SWT中,我们可以使用`Display.asyncExec`或`Display.syncExec`方法来在事件调度线程中执行代码,而使用`new Thread()`来创建并启动新的后台线程来执行耗时任务。以下是一个基本的示例: ```java Button button = ...
由于SWT组件的设计原则是基于单线程模型,即所有的UI操作必须在UI主线程中执行,因此在多线程环境下容易引发线程冲突。本文将详细探讨SWT中的线程冲突问题及其解决方案。 #### SWT线程冲突的原理 SWT库设计之初就...
总结来说,SWT的多线程机制是通过Display类提供的`asyncExec`、`syncExec`和`timerExec`方法来实现的,它们允许开发者在不阻塞UI线程的情况下执行后台任务。理解和熟练运用这些方法是构建高效、响应性强的SWT应用的...
本主题将深入探讨如何利用SWT(Standard Widget Toolkit)和Java来构建一个局域网内的聊天应用,并解决其中涉及的多线程问题。SWT是Eclipse基金会提供的一个开源GUI库,它为Java开发者提供了与操作系统更紧密集成的...
标题"swt页面后台多线程接受ModBUS协议Socket通讯的数据"表明,我们正在讨论一个基于SWT的Java图形用户界面(GUI),该界面的后台使用多线程技术来处理通过Socket接收的遵循ModBUS协议的数据。这样的设计允许用户...
SWT对线程的支持使得开发者可以在后台线程执行耗时操作,而不会阻塞用户界面。通常,使用Display.asyncExec()和Display.syncExec()方法来确保在正确的线程(即UI线程)中更新界面元素,防止出现线程安全问题。 **...
在Java中,线程用于并发执行任务,对于定时任务尤其重要,因为我们需要一个单独的线程在后台运行,监控时间并执行关机操作,而不阻塞用户界面。 在压缩包子文件的文件名列表中,我们可以看到以下几个文件: 1. `swt...
在多线程方面,SWT提供了一个安全的线程模型,确保所有的UI更新都在主线程(通常称为UI线程或Event Dispatch Thread)中执行。这避免了因多线程操作界面导致的竞态条件和死锁问题。开发者可以通过`Display.syncExec...
SWT同样不允许主线程外的其他线程直接访问控件。 所以SWT为我们提供了async执行Runnable的方法。 但是该方法只是用于接收异步线程消息,如果你在该方法中做过多的事情同样会造成UI线程的阻塞。 因此,笔者模仿...
在AWT中,系统或应用程序触发paint事件,系统会决定是部分还是全部组件需要重画,而应用程序通过repaint方法注册异步重画请求,通常使用事件调度线程执行。 在SWT中,绘画机制与AWT和Swing有所不同。SWT组件直接与...
例如,使用`Display.asyncExec`或`Display.syncExec`方法在GUI线程中更新界面,确保界面操作的线程安全。 **Bank子文件** 在"Bank"这个子文件中,很可能是实现了一款与银行相关的模拟软件,可能包括账户管理、交易...
4. **多线程支持**:在Windows平台上,SWT-Win32-Extension 支持在多个线程中操作UI组件,提高了程序的响应速度和性能,尤其是在处理大量数据或执行长时间操作时。 5. **打印和打印预览**:扩展提供了便捷的打印和...
Swt API中的`Display`类是整个GUI的主要入口点,负责管理窗口和线程。`Shell`类代表一个顶级窗口,所有控件都必须包含在一个Shell内。开发者需要注意及时关闭和释放资源,防止内存泄漏。 **7. 文件对话框** Swt...
描述中的“后台线程通过hibernate实现数据库操作”意味着在用户界面上进行的操作,如点击按钮、填写表单等,会触发后台线程执行相应的数据库操作。这通常是异步的,避免了因为等待数据库响应而阻塞用户界面的情况。...
1. GUI线程:在SWT中,所有对GUI的操作必须在事件调度线程(Event Dispatch Thread,EDT)中进行,以保证界面的同步更新和避免数据竞争。 2. 回调机制:使用`Display.asyncExec`或`Display.syncExec`方法来确保在...
7. **异步执行:** 图像处理可能会消耗一定时间,因此通常在后台线程(通过`Display.asyncExec()`或`Display.syncExec()`)执行,以避免阻塞UI。 **SWT截图程序的优势:** 1. **原生体验:** SWT直接调用操作系统...
可能还涉及到了线程管理,因为截图操作可能在后台线程中执行,以避免阻塞用户界面。 总结来说,这个压缩包包含了一个使用SWT实现的屏幕截图应用,涉及到了SWT的基础组件如`Dialog`、`Composite`和`Image`,以及事件...
3. **Display和Thread**:SWT中的所有UI更新都必须在Display线程中执行,以保持UI的一致性。因此,非Display线程生成的事件通常会被放入一个队列,待Display线程空闲时再进行处理。 4. **EventTable**:SWT的Event...
10. **异步操作**:在Eclipse RCP环境中,通常推荐使用异步方式执行数据库查询,以避免阻塞UI线程。 通过理解并应用这些知识点,你可以创建一个功能完备的SWT SQLServer分页组件,为用户提供流畅的数据浏览体验。...