您的位置:首页 > 编程语言 > Java开发

[导入]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级: 有一个进度条对话框,可取消和后台运行

一般使用如下:
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,所以本身就是一个规则类。通常使用如下:
    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不相关的资源。我们可以使用以下几种方式来解决这个问题:

1. job.setRule(null):此时所操作的资源的锁会一个一个的去取得

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: