`

SWT的线程间通信

    博客分类:
  • SWT
阅读更多

在SWT中,通常需要开多个线程来执行任务,因为主线程为UI线程,不能用太长的时间来执行某个任务,否则会造成失去响应的假象。


SWT的线程通信有几个要注意的地方:


1、工作线程访问UI线程。不能在非UI线程中直接访问UI控件的值,要获得或设置控件的值必须通过Display对象的asyncExec()或syncExec()函数,一般的使用方法是:

//代码A:
Display disp = Display.getDefault();
if(disp != null) {
	disp.asyncExec(new Runnable() {
		public void run() {
			//  在这里设置或获得控件的值  
		} 
	}); 
} 

 

2、内部类与外部类的交流。内部类调用外部类局部变量时,该变量必须是final的,这样在取得控件的值后返回给外部类处理时就比较麻烦。例如,在上面的代码段中,有个匿名内部类实现了Runnable接口,在里面的run()函数里可以访问到UI对象,但是,得到了对象的值怎么告诉外面的代码呢?假如用普通的局部变量传递进去,由于是final的,是不能赋值的,所以需要有一个封装类来把需要返回的变量封装起来,这个封装类是final的,但里面的成员变量是可变的,这样就把内部类里得到的东西传递到了外部,不过似乎比较麻烦,不知道有没有更好的办法。

 

//代码B:

class StringWrapper {
	public String uiValue;
}

StringWrapper sw = new StringWrapper(); 
Display disp = Display.getDefault();
if (disp != null )  {
	disp.asyncExec(new  Runnable()  {
		public  void  run()  {
			sw.uiValue = text.getText();//假设text是一个文本框对象
			// 在这里设置或获得控件的值 
		} 
	}); 
} 
//这里就可以对sw.uiValue的值进行访问 

 

 

3、线程间的同步。在上面的代码B中,通过asyncExec()函数来取得控件的值所需要的时间比较长,如果在后面马上访问那些值是得不到的,于是就需要有个同步的问题,即在控件值取得之前先不进行下一步操作。可以通过synchronized块及wait(),notify()机制来实现同步。

//代码C:

class StringWrapper {
   public String uiValue;
}

StringWrapper sw = new StringWrapper(); 
Display disp = Display.getDefault();
if (disp != null )  {
	disp.asyncExec(new  Runnable()  {
		public  void  run()  {
			synchronized(sw){
				sw.uiValue = text.getText();//假设text是一个文本框对象
				sw.notify();
			}
			// 在这里设置或获得控件的值
		} 
	}); 
}
synchronized(sw){
	sw.wait();
} 
//这里就可以对sw.uiValue的值进行访问

 

但是这里会带来一个问题,假如很快就能取得控件的值,但后面还有很长一段时间才会用到该值,如果把sw.wait()语句放在比较后的地方,就有可能造成死锁,因为sw已经被notify之后才开始wait的,再没有其他线程来notify它了,它就只能一直wait下去……。为了解决这个问题,可以(1)把sw.wait()紧跟在disp.asyncExec()后面;(2)给wait()设置一个timeout参数,到了一定的时间还没有东西notify它,它就自己超时。但这两种办法似乎都比较牵强,没有十足的保证,JDK文档里面有个例子,是用while来判断是否已经达到了要求,如果已经达到了就不再wait。

//代码D:

class StringWrapper {
	public String uiValue;
	public boolean isValueSet;//是否已经取得了控件的值
}

StringWrapper sw = new StringWrapper(); 
sw.isValueSet = false;
Display disp = Display.getDefault();
if (disp != null )  {
	disp.asyncExec(new  Runnable()  {
		public  void  run()  {
			synchronized(sw){
				sw.uiValue = text.getText();//假设text是一个文本框对象
				sw.isValueSet = true;
				sw.notify();
			}
			// 在这里设置或获得控件的值
		} 
	}); 
}
synchronized(sw){
	while(!sw.isValueSet){
		try{
			sw.wait();
		}catch (InterruptedException e){
		}
	}
} 
//这里就可以对sw.uiValue的值进行访问

 

分享到:
评论

相关推荐

    局域网聊天 SWT Java 多线程问题已经解决

    不过,需要注意的是,线程间通信和共享数据需要使用synchronized关键字进行同步,或者使用java.util.concurrent包下的并发工具类,如BlockingQueue。 QQ作为知名的即时通讯软件,它的实现原理与我们的局域网聊天...

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

    在实际应用中,我们可能还需要考虑线程间的通信,例如通过`BlockingQueue`传递数据,或者使用`CountDownLatch`或`CyclicBarrier`等同步工具来协调线程。同时,为了防止内存泄漏,记得在不再需要线程时关闭或中断它们...

    swt页面后台多线程接受ModBUS协议Socket通讯的数据

    3. **Socket通讯**:Socket是网络编程的基础,它提供了进程间通信(IPC)的一种方式,尤其是在跨网络的环境中。在Java中,Socket类和ServerSocket类分别用于客户端和服务器端的通信。一个Socket连接由IP地址和端口号...

    swt入门学习资料

    在编程时,Display 是 SWT 应用程序的入口点,它负责事件循环和线程间的通信。Shell 是 SWT 界面中的窗口对象,可以有多种样式,如普通窗口或对话框。Widgets 是 SWT 中的具体控件,如按钮、文本框等,它们通过 ...

    Eclipse中使用SWT进行界面设计

    Display是整个UI的核心,它管理事件循环,协调UI线程与其他线程间的通信。Shell是应用程序中与操作系统窗口管理器交互的窗口,可以是主窗口(顶级Shell)或对话框(Dialog Shell)。Shell的样式可以通过风格位(style...

    Eclipse之SWT编程

    - `Display`:负责管理事件循环和协调UI线程与其他线程间的通信。在多线程环境中,每个线程可以拥有自己的`Display`实例,而`Display.getCurrent()`方法可帮助获取当前活跃的`Display`实例。 - `Shell`:代表操作...

    在Eclipse中用SWT设计界面

    Display管理事件循环和线程间的通信,是程序运行的核心;Shell代表应用程序中的窗口,可最大化、最小化或正常化,分为高层shell和对话shell两种类型;Widgets则是用户界面的各种控件,如按钮、文本框等,其样式和...

    使用Eclipse进行SWT编程

    1. **Display**:管理事件循环并协调UI线程与其他线程间的通信。每个应用程序至少有一个Display实例。 2. **Shell**:代表操作系统中的窗口,可以是顶层窗口或依赖其他Shell的对话框。Shell的样式可以通过构造函数...

    教你使用Eclipse进行SWT编程(普通下载).doc

    Display是管理事件循环和UI线程间通信的核心对象。Shell代表了操作系统级别的窗口,可进行最大化、正常化和最小化操作。Shell分为顶层Shell和对话Shell,前者作为Display的主要窗口,后者通常用作对话框。Widgets则...

    java SWT编写JGroup局域网聊天程序

    这是为了避免由于线程间的竞争导致的界面不稳定或者数据不一致等问题。如果尝试从非事件分派线程中更新界面元素,则会引发异常。 针对本文描述的问题,作者发现只有在使用了 SWT 的地方才会出现线程错误。这是因为 ...

    ATM.rar_ATM socket_SWT socket_java ATM_java atm socket

    Socket通信**: Socket提供了进程间的通信能力,特别是在网络环境中。在这个项目中,ATM客户端通过socket连接到服务器,发送请求(如取款、存款)并接收响应。Java的`java.net.Socket`类和`ServerSocket`类是实现这...

    eclipse开发技术详解第4章

    3. 在类中初始化Display对象,这是管理事件循环和线程间通信的核心。 4. 创建Shell对象,它是应用程序的顶级窗口。 5. 在Shell中添加组件,如按钮、文本框等,并通过Display支持它们的显示。 6. 实现事件监听,当...

    eclipse从入门到精通

    在GUI编程中,正确处理线程间通信是避免界面冻结、提升用户体验的关键。SWT提供了一套线程安全的API,允许开发者在不影响用户界面响应的情况下执行耗时操作。通过学习SWT线程管理,开发者可以构建出既高效又稳定的...

    基于java的多线程与线程安全实践-基于Http协议的断点续传系统毕业设计与实现(源代码).zip

    线程间可能需要协调工作,例如同步下载进度,避免同一块数据被多个线程同时处理。 2. **文件分块**:将大文件分割成多个小块,每个线程下载一个或多个块。分块大小需要考虑网络状况和内存使用。 3. **状态存储**:...

    基于java的多线程与线程安全实践-基于Http协议的断点续传设计与实现毕业设计.zip

    同时,线程间的协作与同步是关键,避免竞态条件和死锁是线程安全的核心挑战。 综上所述,这个毕业设计涵盖了Java多线程编程、线程安全、HTTP协议的实战应用,以及文件下载管理等多个核心知识点,对于提升学生的实战...

    达内 聊天室 chatroom

    Socket是TCP/IP协议族的一部分,它为两台机器间的应用程序提供了一个端到端的通信机制。在Java中,Socket类代表网络上的一个端点,它允许应用程序通过TCP协议发送和接收数据。在聊天室中,服务器端会创建一个...

    Eclipse插件开发(第3版 - 高清).pdf.zip

    书中还会涉及如何设计和组织插件结构,以及如何利用Eclipse的模型和事件机制实现组件间的通信和协作。 通过阅读《Eclipse插件开发(第3版 - 高清)》,开发者不仅可以掌握Eclipse插件开发的基本技能,还能了解到...

    java仿QQ功能实现

    - **聊天功能**:这是即时通讯软件的核心,需要实现用户间的实时消息传递。这可能涉及到网络编程(如Socket编程)和并发处理,以确保消息的快速发送和接收。 - **添加好友**:需要设计一个系统让用户可以搜索并...

    视频播放器课程设计报告报告.docx

    2. Android是一个全面的开放性移动设备平台,旨在建立标准化、开放式的移动电话软件平台,促进应用间的通用性和互联性。 3. Android应用之间平等运行,所有应用都基于一个核心的虚拟机(Dalvik虚拟机)运行,通过API...

Global site tag (gtag.js) - Google Analytics