[导入]Eclipse中Job API使用总结如下一
2008-01-10 21:56
381 查看
网站: JavaEye
作者: liugang594
链接:http://liugang594.javaeye.com/blog/154919
发表时间: 2008年01月10日
声明:本文系JavaEye网站发布的原创博客文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!
1. 一般的长时间的后台工作都应该使用Job,Job可分为三个等级:
System级:对用户没有反馈
Default级:在状态栏中有反馈
User级: 有一个进度条对话框,可取消和后台运行
一般使用如下:
2. 如果有多个Job要运行,并且想统一管理的话,可以使用Job族。一个Job族可以对一组Job进行统一的操作管理,如:cancel, find, join, sleep, 和 wakeUp等等。一般使用如下:
1. 定义一个Job族类:
2. 管理一组族内的Job:
3. 为了避免死锁,需要对多个job之间资源访问进行管理和控制,这是通过定义调度规则来实现的(Scheduling rules)。每个调度规则都是ISchedulingRule的实现,通常使用如下:
2. 使用MultiRule通常来说我们都应该使用第二种方式,因为第一种方式是可打断的!
下面就介绍多个规则的使用。一般使用多个规则都是通常以下方式实现的:
这就是,我们把所要访问到的锁都合并在一起,然后得到这些锁后再操作,这就避免了整个工作空间的锁定:
本文的讨论也很精彩,浏览讨论>>
JavaEye推荐
文章来源:http://liugang594.javaeye.com/blog/154919
作者: liugang594
链接:http://liugang594.javaeye.com/blog/154919
发表时间: 2008年01月10日
声明:本文系JavaEye网站发布的原创博客文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!
1. 一般的长时间的后台工作都应该使用Job,Job可分为三个等级:
System级:对用户没有反馈
Default级:在状态栏中有反馈
User级: 有一个进度条对话框,可取消和后台运行
一般使用如下:
final Job job = new Job("Long Running Job") { protected IStatus run(IProgressMonitor monitor) { try { while(hasMoreWorkToDo()) { // do some work // ... if (monitor.isCanceled()) return Status.CANCEL_STATUS; } return Status.OK_STATUS; } finally { schedule(60000); // start again in an hour } } }; job.addJobChangeListener(new JobChangeAdapter() { public void done(IJobChangeEvent event) { if (event.getResult().isOK()) postMessage("Job completed successfully"); else postError("Job did not complete successfully"); } }); job.setSystem(true); job.schedule(); // start as soon as possible
2. 如果有多个Job要运行,并且想统一管理的话,可以使用Job族。一个Job族可以对一组Job进行统一的操作管理,如:cancel, find, join, sleep, 和 wakeUp等等。一般使用如下:
1. 定义一个Job族类:
public class FamilyMember extends Job { private String lastName; public FamilyMember(String firstName, String lastName) { super(firstName + " " + lastName); this.lastName = lastName; } protected IStatus run(IProgressMonitor monitor) { // Take care of family business return Status.OK_STATUS; } public boolean belongsTo(Object family) { return lastName.equals(family); } }
2. 管理一组族内的Job:
// Create some family members and schedule them new FamilyMember("Bridget", "Jones").schedule(); new FamilyMember("Tom", "Jones").schedule(); new FamilyMember("Indiana", "Jones").schedule(); // Obtain the Platform job manager IJobManager manager = Platform.getJobManager(); // put the family to sleep manager.sleep("Jones"); // put the family to sleep for good! manager.cancel("Jones");
3. 为了避免死锁,需要对多个job之间资源访问进行管理和控制,这是通过定义调度规则来实现的(Scheduling rules)。每个调度规则都是ISchedulingRule的实现,通常使用如下:
ISchedulingRule myRule = ... job.setSchedulingRule(myRule);[/code] ISchedulingRule接口中定义了两个方法,如下:
public interface ISchedulingRule { //用来判断是否冲突 public boolean isConflicting(ISchedulingRule rule); //用来判断所需要条件的满足 public boolean contains(ISchedulingRule rule); }
Eclipse中所有资源类都实现了接口ISchedulingRule,所以本身就是一个规则类。通常使用如下:1. job.setRule(null):此时所操作的资源的锁会一个一个的去取得final IProject project = ResourcesPlugin.getWorkspace() .getRoot().getProject("MyProject"); Job job = new Job("Make Files") { public IStatus run(IProgressMonitor monitor) { try { monitor.beginTask("Create some files", 100); for (int i=0; i<10; i++) { project.getFile("file" + i).create( new ByteArrayInputStream( ("This is file " + i).getBytes()), false /* force */, new SubProgressMonitor(monitor, 10)); if (monitor.isCanceled()) return Status.CANCEL_STATUS; } } catch(CoreException e) { return e.getStatus(); } finally { monitor.done(); } return Status.OK_STATUS; } }; job.setRule(ResourcesPlugin.getWorkspace().getRoot()); job.schedule();
4. 在上例中,当这个job在运行时它是锁定两个工作空间。这会带来一个问题:我们没有办法再访问
工作空间中与此job不相关的资源。我们可以使用以下几种方式来解决这个问题:
2. 使用MultiRule通常来说我们都应该使用第二种方式,因为第一种方式是可打断的!
下面就介绍多个规则的使用。一般使用多个规则都是通常以下方式实现的:
public ISchedulingRule createRule(IFile[] files) { ISchedulingRule combinedRule = null; IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory(); for (int i = 0; i < files.length; i++) { ISchedulingRule rule = ruleFactory.createRule(files[i]); combinedRule = MultiRule.combine(rule, combinedRule); } return combinedRule; }
这就是,我们把所要访问到的锁都合并在一起,然后得到这些锁后再操作,这就避免了整个工作空间的锁定:
job.setRule(createRule(files));
本文的讨论也很精彩,浏览讨论>>
JavaEye推荐
文章来源:http://liugang594.javaeye.com/blog/154919
相关文章推荐
- [导入]Eclipse中Job API使用总结如下二
- [导入]Eclipse中Job API使用总结如下三
- Android Studio 之 导入Eclipse项目常见问题及解决方案 在将Eclipse做的Android项目成功导入Android Studio 后,启动生成,遇到一些问题,现总结如下:
- Java基础-11总结Eclipse使用,API,Object类
- 常见对象_Eclipse的概述使用、API的概述、Object类总结
- Java基础-11总结Eclipse使用,API,Object类
- AS基本使用总结之从svn导入eclipseADT项目
- Maven学习总结(七)——eclipse中使用Maven创建Web项目
- 使用eclipse配置Dynamic Web Project动态web项目的一些总结
- 使用Eclipse时的配置备份/提取与导入
- spark streaming kafka1.4.1中的低阶api createDirectStream使用总结
- 使用 eclipse时,出现如下问题:org.eclipse.swt.SWTError: No more handles的解决办法
- 新版Eclipse使用遇到的问题总结
- 如何使用Eclipse导入并运行源码
- eclipse使用之导入第三方jar包
- elasticsearch学习总结(三) API的使用范例3
- elasticsearch学习总结(三) API的使用范例4
- git的使用,使用eclipse 从github导入项目及提交源代码
- [导入].NET环境下水晶报表使用总结
- 使用Eclipse来搭建hadoop开发环境问题总结