这样对于myjob和myjob这两个Job它们不会再同时执行Myjob会等待myjob执行完再执行这是由Eclipse的JobManager来提供实现的JobManager可以保证所有启动的Job中任意两个Job的rule是没有沖突的我们在上面定义的rule是最简单的我们可以重写isConflicting函数来实现一些更加复杂的控制比如控制同时同类型的Job最多只有指定的个数在运行但是我们要注意isConflicting方法不能过于复杂一旦一个Job的rule与其他Job的rule有沖突isConflicting方法会调用很多次如果其中的计算过于复杂会影响整体的性能
根据需要执行Job 由于我们有的Job有可能不是立即执行的在有些情况下等到该Job准备执行的时候该Job所要执行的任务已经没有意义了这时我们可以使用Job的shouldSchedule()和shouldRun()来避免Job的运行在我们定义一个Job时我们可以重载shouldSchedule和shouldRun方法在这些方法中我们可以检查Job运行的一些先决条件如果这些条件不满足我们就可以返回falseJobManager在安排Job运行时它会先调用该Job的shouldSchedule方法如果返回为falseJobManager就不会再安排这个Job运行了同样JobManager在真正启动一个线程运行一个Job前它会调用该Job的shouldRun方法如果返回false它不再运行这个Job在下面的例子中我们希望启动一个Job在十秒钟之后更新文本框中的内容为了保证我们的Job运行时是有意义的我们需要确保我们要更新的文本框没有被销毁我们重载了shouldSchedule和shouldRun方法
Text text = new Text(parentSWTNONE);
UIJob refreshJob = new UIJob(更新界面){
public IStatus runInUIThread(IProgressMonitor monitor) {
textsetText(新文本);
return StatusOK_STATUS;
}
public boolean shouldSchedule(){
return !textisDisposed();
}
public boolean shouldRun(){
return !textisDisposed();
}
};
refreshJobschedule();
在UI线程中涉及长时间处理的任务 我们经常碰到这样一种情况用户操作菜单或者按钮会触发查询大量数据数据查询完后更新表格等界面元素用户点击菜单或者按钮所触发的处理程序一般处于UI线程为了避免阻塞UI我们必须把数据查询等费时的工作放到单独的Job中执行一旦数据查询完毕我们又必须更新界面这时我们又需要使用UI线程进行处理下面是处理这种情况的示例代码
buttonaddSelectionListener(new SelectionListener(){
public void widgetSelected(SelectionEvent e){
perform();
}
public void widgetDefaultSelected(SelectionEvent e){
perform();
}
private void perform(){
Job job = new Job(获取数据){
protected IStatus run(IProgressMonitor monitor){
// 在此添加获取数据的代码
DisplaygetDefault()asyncExec(new Runnable(){
public void run(){
// 在此添加更新界面的代码
}
});
}
};
jobschedule();
}
});
[] [] [] [] [] []