SWT多线程

[color=cyan][b]一:基本概念[/b][/color]
在SWT内,有一个UI主线程的概念,自定义的线程不可操作UI控件,如果要操作则必须使用

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

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


[b][color=cyan]二:Display.asyncExec与Display.syncExec[/color][/b]

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

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


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

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


[color=cyan][b]三:Job与UIJob[/b][/color]
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即可。


[b][color=cyan]四:IProgressService的busyCursorWhile与runInUI[/color][/b]

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());



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


[b][color=cyan]六:Job异常处理[/color][/b]
异常的处理可以有不同:
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();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值