`
lggege
  • 浏览: 375466 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SWT多线程

    博客分类:
  • RCP
阅读更多
一:基本概念
在SWT内,有一个UI主线程的概念,自定义的线程不可操作UI控件,如果要操作则必须使用
display.asyncExec(new Runnable() {
	public void run() {
             // UI操作
	}
});

需要注意的是:在Display.asyncExec()方法内运行的线程就是UI主线程,而不是用户自定义的线程。通过简单的实验可以知道,可见附件。


二:Display.asyncExec与Display.syncExec
display.asyncExec(new Runnable() {
	public void run() {
           // UI操作
	}
});

Display.asyncExec()方法,下面的代码可以继续执行,而不用等到Display.asyncExec()的完成。

display.syncExec(new Runnable() {
	public void run() {
           // UI操作
	}
});

Display.syncExec()方法,会让在下面的代码进入等待,需要等到Display.syncExec()的完成才可以继续向下执行。


三:Job与UIJob
1. Job与UIJob都必须工作在eclipse环境下,也就是Eclipse或RCP环境下。
2. 提供了进度条,子任务,状态等功能。
3. UIJob extends Job,UIJob是对Job的简单封装,使得任务运行于Display.asyncExec()方法内。

Job uploadJob = new Job("Job...") {
    protected IStatus run(IProgressMonitor monitor) {
        // 非UI线程,只能进行非UI的操作
    }
}

UIJob dbJob = new UIJob("UIJob...") {
    public  IStatus runInUIThread(IProgressMonitor monitor){
        // UI主线程,可进行UI操作
    }
}

当然,需要在Job内进行UI操作,只需要使用Display.asyncExec或Display.syncExec即可。


四:IProgressService的busyCursorWhile与runInUI

IProgressService progressService = PlatformUI.getWorkbench().getProgressService();
   progressService.busyCursorWhile(new IRunnableWithProgress(){
      public void run(IProgressMonitor monitor) {
         // 非UI线程,只能进行非UI的操作
      }
   });

progressService.runInUI(
      PlatformUI.getWorkbench().getProgressService(),
      new IRunnableWithProgress() {
         public void run(IProgressMonitor monitor) {
            // UI主线程,可进行UI操作
         }
      },
      Platform.getWorkspace().getRoot());



五:Job的状态监听
Job的状态监听,涉及到一个接口IJobChangeListener,或者空实现类JobChangeAdapter。
IJobChangeListener用于对Job的状态进行监听,比如:开始执行,完成,睡眠等状态改变的时候。


六:Job异常处理
异常的处理可以有不同:
1. 将异常直接抛出来:在Job执行过程中,返回带有Exception的Status。
		protected IStatus run(IProgressMonitor monitor) {
			try {
				doJob(monitor); // false
			} catch (Exception e) {
				return new Status(Status.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);
			}
			return Status.OK_STATUS;
		}
	};


2. 所有Job完成后进行错误提示:在Job执行过程中,可以将异常保存起来,并借助于IJobChangeListener的done进行job完成后的操作,比如进行异常提示等操作。
job.addJobChangeListener(new JobDoneListener());

class JobDoneListener extends JobChangeAdapter {
		@Override
		public void done(IJobChangeEvent event) {
			if (exception != null) {
				exception.printStackTrace();
			}

分享到:
评论

相关推荐

    swt 多线程

    本文将深入探讨SWT中多线程的使用,特别是与UI交互相关的多线程原理。 首先,我们需要理解UI线程,也称为事件调度线程或AWT/SWT线程,它负责处理所有的用户界面更新和事件处理。在SWT中,所有的GUI操作必须在UI线程...

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

    本主题将深入探讨如何利用SWT(Standard Widget Toolkit)和Java来构建一个局域网内的聊天应用,并解决其中涉及的多线程问题。SWT是Eclipse基金会提供的一个开源GUI库,它为Java开发者提供了与操作系统更紧密集成的...

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

    SWT(Standard Widget ...这涉及到对Java多线程的理解,以及如何在SWT环境中正确地在事件调度线程和后台线程之间切换,以处理UI更新和耗时任务。通过这种方式,我们可以构建出高效且用户体验良好的桌面应用程序。

    swt线程冲突与解决

    由于SWT组件的设计原则是基于单线程模型,即所有的UI操作必须在UI主线程中执行,因此在多线程环境下容易引发线程冲突。本文将详细探讨SWT中的线程冲突问题及其解决方案。 #### SWT线程冲突的原理 SWT库设计之初就...

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

    标题"swt页面后台多线程接受ModBUS协议Socket通讯的数据"表明,我们正在讨论一个基于SWT的Java图形用户界面(GUI),该界面的后台使用多线程技术来处理通过Socket接收的遵循ModBUS协议的数据。这样的设计允许用户...

    SWT/jface等GUI类库开发简易聊天室系统+java多线程

    用swt开发多用户聊天程序。SWT/jface等GUI类库开发简易聊天室系统+java多线程。

    基于SWT技术的Java多线程文件断点续传下载设计源码

    该源码项目基于SWT技术,实现了一个跨平台的Java多线程文件断点续传下载系统。项目总文件量为117个,其中包括49个类文件、24个Java源文件、22个JAR文件、8个JPG图片文件、4个PNG图片文件、2个Markdown文件和2个...

    java socket多线程聊天

    总的来说,这个Java Socket多线程聊天软件利用了Java的网络编程能力、多线程特性和SWT GUI库,实现了服务器与多个客户端之间的实时、双向通信,为用户提供了一个实用的在线聊天平台。通过这样的实践,开发者可以深入...

    全屏的SWT多媒体播放器

    综上所述,开发一个全屏SWT多媒体播放器涉及多方面的技术和细节。从SWT的基本使用到多媒体播放的实现,再到用户界面的设计和优化,都需要开发者具备扎实的编程基础和对多媒体技术的理解。在实际开发过程中,还需要...

    多线程下载技术论文.rar

    线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配.线程越...

    Java swt完整教程

    - SWT对多线程的支持更好,适合复杂的多线程GUI应用。 - Swing则提供跨平台的一致性,并且拥有丰富的内置组件和事件模型。 3. SWT组件 SWT包括各种常见的GUI组件,如按钮(Button)、文本框(Text)、列表(List...

    用SWT做界面的定时关机软件

    这个项目是一个典型的Java GUI应用程序示例,结合了SWT库的使用,多线程编程,以及与操作系统的交互,为用户提供了一种方便的定时关机解决方案。通过研究其源代码,开发者可以学习到如何构建类似的应用,并深入了解...

    swt源码以及jar

    在多线程方面,SWT提供了一个安全的线程模型,确保所有的UI更新都在主线程(通常称为UI线程或Event Dispatch Thread)中执行。这避免了因多线程操作界面导致的竞态条件和死锁问题。开发者可以通过`Display.syncExec...

    SWT_全接触 SWT_全接触 SWT_全接触

    3. **消息循环**:SWT使用了类似Windows的消息循环机制,而不是Swing中的事件分发线程。通过不断地读取消息并分发处理,维持窗口的响应状态。 ### 结论 SWT作为一款强大的GUI组件库,对于那些希望在Java应用程序中...

    SWT深入内幕之消息机制探秘.pdf

    不同于MFC使用窗口查找表的技术可能会导致线程间消息传递的问题,SWT的设计更加健壮,能够更好地处理多线程环境下的消息。SWT利用了JNI的特性,确保即使在多线程环境中也能正确地处理消息。 #### 四、与其他框架的...

    SWT视频播放器

    6. **多线程处理**:为了保证界面的响应性,视频播放通常在后台线程进行,防止阻塞主线程。 7. **音频同步**:视频播放器还需要处理音频和视频的同步问题,确保音画同步。 8. **格式支持**:集成的多媒体库决定了...

    swt64位和32位jar包4.3版本可用

    它是Eclipse项目的一部分,提供了与操作系统更紧密集成的功能,比如原生对话框、控件和多线程支持。标题提到的是SWT的4.3版本,提供了适用于64位和32位操作系统的jar包。 在Java中,JVM(Java虚拟机)根据安装的...

    swt资源释放问题

    如果需要创建多个同时活动的 Display 实例必须在不同的线程中创建它们,并使用 Display 的 getCurrent 函数得到当前线程对应的 Display 实例。 在 SWT 中,为了使资源管理方便而规定:当父资源被释放时,它要负责...

    swt入门学习资料

    SWT 的优势在于它使用本地组件,这意味着 SWT 应用程序具有更好的性能和原生外观,同时支持更多的操作系统特性。由于 SWT 直接调用操作系统 API,所以它的应用程序看起来和行为更接近于原生应用。此外,SWT 也提供了...

Global site tag (gtag.js) - Google Analytics