快速业务通道

Eclipse的字符串分区共享优化机制 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
ngPoolJob == null)    stringPoolJob = new StringPoolJob(); // Singleton 模式    stringPoolJob.addStringPoolParticipant(participant, rule);   } } // // org.eclipse.core.internal.runtime.StringPoolJob // public class StringPoolJob extends Job {   private static final long INITIAL_DELAY = 10000;//five seconds   private Map participants = Collections.synchronizedMap(new HashMap(10));   public void addStringPoolParticipant(IStringPoolParticipant participant, ISchedulingRule rule) {   participants.put(participant, rule);   if (sleep())    wakeUp(INITIAL_DELAY);   }   public void removeStringPoolParticipant(IStringPoolParticipant participant) {    participants.remove(participant);   } }

Eclipse的字符串分区共享优化机制(5)

时间:2011-01-03

此任务将在合适的时候,为每个注册的分区进行共享优化。

StringPoolJob 类型是分区任务的代码所在,其底层实现是通过 Eclipse 的任务调度机制。关于 Eclipse 的任务调度,有兴趣的朋友可以参考 Michael Valenta (IBM) 的 On the Job: The Eclipse Jobs API 一文。

这里需要了解的是 Job 在 Eclipse 里,被作为一个异步后台任务进行调度,在时间或资源就绪的情况下,通过调用其 Job.run 方法执行。可以说 Job 非常类似一个线程,只不过是基于条件进行调度,可通过后台线程池进行优化罢了。而这里任务被调度的条件,一方面是任务自身的调度时间因素,另一方面是通过 ISchedulingRule 接口提供的任务资源依赖关系。如果一个任务与当前正在运行的任务传统,则将被挂起直到冲突被缓解。而 ISchedulingRule 接口本身可以通过 composite 模式进行组合,描述复杂的任务依赖关系。

在具体完成任务的 StringPoolJob.run 方法中,将对所有字符串缓冲分区的调度条件进行合并,以便在条件允许的情况下,调用 StringPoolJob.shareStrings 方法完成实际工作。

代码:

// // org.eclipse.core.internal.runtime.StringPoolJob // public class StringPoolJob extends Job {   private static final long RESCHEDULE_DELAY = 300000;//five minutes   protected IStatus run(IProgressMonitor monitor)   {    //copy current participants to handle concurrent additions and removals to map    Map.Entry[] entries = (Map.Entry[]) participants.entrySet().toArray(new Map.Entry[0]);    ISchedulingRule[] rules = new ISchedulingRule[entries.length];    IStringPoolParticipant[] toRun = new IStringPoolParticipant[entries.length];    for (int i = 0; i < toRun.length; i++) {     toRun[i] = (IStringPoolParticipant) entries[i].getKey();     rules[i] = (ISchedulingRule) entries[i].getValue();    }    // 将所有字符串缓冲分区的调度条件进行合并    final ISchedulingRule rule = MultiRule.combine(rules);    // 在调度条件允许的情况下调用 shareStrings 方法执行优化    try {     Platform.getJobManager().beginRule(rule, monitor); // 阻塞直至调度条件允许     shareStrings(toRun, monitor);    } finally {     Platform.getJobManager().endRule(rule);    }    // 重新调度任务自己,以便进行下一次优化    long scheduleDelay = Math.max(RESCHEDULE_DELAY, lastDuration*100);    schedule(scheduleDelay);    return Status.OK_STATUS;   } }

StringPoolJob.shareStrings 方法只是简单的遍历所有分区,调用其根

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号