[导入]Eclipse中Job API使用总结如下三
网站: JavaEye 作者: liugang594 链接:http://liugang594.javaeye.com/blog/154925 发表时间: 2008年01月10日
声明:本文系JavaEye网站发布的原创博客文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!
1. 使用job的一个好处就是可以在后台运行。
但是如果不给用户于提示的话,很多时候会让用户很困惑,这就有必要增加回显。上面又说了,提供回显会增加复杂性。下面就是解决这个问题的方案!记得在第一部分,说过一个job有三个级别:system、user、default。只要不是system级的,就会有回显给用户。最常见的就是工作台右下角的进度显示:
如果是用户级的,进一步,我们可以有一个进度对话框:
用户级时,如果用户没有选择在后台运行,那么很容易判断工作完成,因为对话框会关闭。但是如果运行了在后台运行,或者是缺省级的,那又怎么办呢?当然最简单的,我们可以在progress view里查看:
首先定义这个job:
Job job = new Job("Online Reservation") {
protected IStatus run(IProgressMonitor monitor) {
// Make a reservation
// ...
setProperty(IProgressConstants.ICON_PROPERTY, Activator .getImageDescriptor("icons/sample.gif"));
if (isModal(this)) {
// The progress dialog is still open so
// just open the message
showResults();
} else { setProperty(IProgressConstants.KEEP_PROPERTY, Boolean.TRUE); setProperty(IProgressConstants.ACTION_PROPERTY, getReservationCompletedAction());
}
return Status.OK_STATUS;
}
};
job.setUser(true);
job.schedule();
isModel()方法如下: public boolean isModal(Job job) {
Boolean isModal = (Boolean) job
.getProperty(IProgressConstants.PROPERTY_IN_DIALOG);
if (isModal == null)
return false;
return isModal.booleanValue();
}
getReservationCompletedAction()方法如下:
protected static Action getReservationCompletedAction() {
return new Action("View reservation status") {
public void run() {
MessageDialog.openInformation(Display.getDefault()
.getActiveShell(), "Reservation Complete",
"Your reservation has been completed");
}
};
}
showResults()方法如下:
protected static void showResults() {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
getReservationCompletedAction().run();
}
});
}
更多的用法,可以参见job的帮助和IProgressConstants常量的用法!这里当使用对话框等待时,当任务结束后,信息对话框弹出有问题!有一个非法管理状态异常!大家可以试试!最后运行结果大致如下:
点OK出现对话框!
2. 对job进行分组。
有可以多个job都同属于一个逻辑任务,这时可以对这些job进行分组,使用job的如下方法:setProgressGroup()具体的看job的帮助!
3. 保护数据的完整性
上面介绍的都是一些互斥访问的实现,没有讲到数据完整性的保护!在eclipse的org.eclispe.core.runtime插件中提供了一种锁的机制,用来保护数据在被操作时不会被打断。使用方式如下:
private static ILock lock = Platform.getJobManager().newLock();
try {
lock.acquire();
// Access or modify data structure
} finally {
lock.release();
}
注意,try-finally块是必须的,用于确保在任何时候锁都能够被释放!这里也提示一下,在请求资源锁时,也应该做同样的事情! 好,以上就是所有的总结的内容!
本文的讨论也很精彩,浏览讨论>>
JavaEye推荐
文章来源:http://liugang594.javaeye.com/blog/154925
浙公网安备 33010602011771号