惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 司徒正美
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
腾讯CDC
WordPress大学
WordPress大学
爱范儿
爱范儿
GbyAI
GbyAI
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 聂微东
Google DeepMind News
Google DeepMind News
Recent Announcements
Recent Announcements
Latest news
Latest news
Last Week in AI
Last Week in AI
V2EX - 技术
V2EX - 技术
I
InfoQ
N
News | PayPal Newsroom
SecWiki News
SecWiki News
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
T
Troy Hunt's Blog
H
Hacker News: Front Page
S
SegmentFault 最新的问题
TaoSecurity Blog
TaoSecurity Blog
V
Visual Studio Blog
Martin Fowler
Martin Fowler
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园_首页
S
Security @ Cisco Blogs
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
小众软件
小众软件
L
LangChain Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Tor Project blog
L
LINUX DO - 热门话题
月光博客
月光博客
S
Schneier on Security
Y
Y Combinator Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Proofpoint News Feed
Forbes - Security
Forbes - Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Hugging Face - Blog
Hugging Face - Blog
A
Arctic Wolf
Webroot Blog
Webroot Blog
博客园 - 叶小钗
F
Fortinet All Blogs
S
Securelist
AI
AI
B
Blog RSS Feed
Security Latest
Security Latest

博客园 - 刘刚

Google Map [导入]Editor中嵌入Editor [导入]GEF中修改默认的FeedBack [导入](接上篇)关于GEF Feedback的补充 [导入]GEF中导视图的使用 [导入]修改GEF中Connection的端点 [导入]Eclipse中Job API使用总结如下三 [导入]Eclipse中Job API使用总结如下二 [导入]Eclipse调试框架的学习与理解二 [导入]Eclipse调试框架的学习与理解一 [导入]使用JET自动生成代码 [导入]定义自己的Common Navigator三 [导入]定义自己的Common Navigator二 [导入]定义自己的Common Navigator一 [导入]Eclipse运行(launcher)框架三 [导入]Eclipse运行(launcher)框架二 [导入]Eclipse运行(launcher)框架一 [导入]Eclipse属性页的支持 [导入]GEF理解系列九
[导入]Eclipse中Job API使用总结如下一
刘刚 · 2008-01-10 · via 博客园 - 刘刚

网站: JavaEye  作者: liugang594  链接:http://liugang594.javaeye.com/blog/154919  发表时间: 2008年01月10日

声明:本文系JavaEye网站发布的原创博客文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!

 1. 一般的长时间的后台工作都应该使用JobJob可分为三个等级:

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

    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