SWT多线程

一:基本概念
在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();
			}

你可能感兴趣的:(java,eclipse,多线程,UI,工作)