浅谈Eclipse中的Jobs框架

开发 后端
本文介绍了Eclipse平台的Jobs框架,这是Eclipse运行时的重要组成部分,Eclipse多线程机制的关键之一。 Job 可以异步的执行,多个 Jobs 可以并发执行。

了解Eclipse多线程机制,需要先了解一下Jobs框架——这是Eclipse运行时的重要组成部分。Jobs框架介绍如下:

Eclipse 在 org.eclipse.core.runtime.osgi 运行时插件里提供了 Jobs API 。 Jobs API 被广泛的应用到 Eclipse 平台中,用户所开发的 eclipse 插件里。 Job 是 Eclipse 运行时重要的组成部分(基于 equinox 的 OSGi 框架则是 Eclipse 运行时的最重要的组成部分)。 Job 可以理解成被平台调用异步运行的代码块。 Job 可以异步的执行,多个 Jobs 可以并发执行。那么读者会问了?为什么 eclipse 平台要提供这样的 API 出来,为什么不直接使用 java.lang.Thread 呢?

原因有以下几点:

1)性能更好:通过使用线程池实现了线程共享,减少了创建和销毁线程的开销,提高了性能。

2)交互响应信息:Job 提供了一个框架,开发人员使用 Job 很容易实现与用户的交互,例如允许用户取消 Job 的执行或者显示 Job 。

3)调度的灵活性:可以马上运行一个 Job,可以稍后运行一个 Job, 还可以反复的运行一个 Job

4)Job 的监听机制:Job 监听器监听 Job 的状态信息,比如,知道一个 Job 何时开始运行以及何时结束运行等。

5)优先级及互斥的灵活应用:Job 提供了多种方式来控制 Job 的调度,开发者可以设定 Job 的优先级(读者应注意这一点,JobManager 不保证优先级高的 Job 一定比优先级低的 Job 先被调度执行),也可以使用调度规则保证 Jobs 的同步与互斥。

下面我们首先介绍一下 Jobs 的框架 , 如图 1 所示。其囊括了 org.eclipse.core.runtime.jobs 包内的所有接口和类。

Jobs 框架 

图 1. Jobs框架 

IJobManager 是 Job 管理器类的接口,其中定义了一些对 Job 以及 JobFamily 操作的一些 API 。有关 Job 管理器的实现,我们将在线程池机制一节中作详细介绍。

当并发执行多个 Jobs 的时候,可能会引发冲突(Conflict)。 Job 的框架则充分考虑到了这种情况,并提供了管理和避免冲突的工具。 ISchedulingRule 接口,是用来管理共享资源访问冲突的技术。它使得 IJobManager 能够识别出冲突的 Jobs,进而能保证这些不能在一起执行的 Jobs 不在同一时间被调度或者启动。 ISchedulingRule 接口的子类 MultiRule 表示一组固定的子调度规则,如果任何一个 MultiRule 的子调度规则和另一个调度规则相冲突,那么该 MultiRule 和另一个调度规则就会发生冲突。形式化的说,一个组合调度规则表示其所有的子调度规则关于 isConflicting 方法等价的逻辑交集。组合调度规则不会再包含另一个组合调度规则,如果你把一个组合规则作为子规则加入到另一个组合规则中,算法就是该组合规则的所有子规则被加入到另一个组合规则中去了。

ILock ,锁是用来对排他性资源的访问控制的。锁是可以重入的,也就是说同一个线程在不释放已有锁的情况下,可多次获取该锁。当成功获取锁的次数和成功释放锁的次数相等时,锁才能被释放掉。通过实现释放等待策略,锁避免了循环等待的死锁。如果一组线程陷入一个死锁,一个线程将会失去它所拥有的锁,进而打破死锁,使得其它的线程能够继续执行。一旦线程获得了运行所需要的所有的锁,它将获得对锁控制的排他性资源的访问。

当一个线程正等待一个 acquire() 方法调用的时候,才可能会失去锁 ( 参见本文的线程同步机制部分 ) 。程序应用队列(先来先得)管理不同的线程来获取锁。线程获取的锁一定要释放掉,一般在 finally 程序块内释放锁。例如:

  1. lock.acquire();   
  2.  try {   
  3.      // ... 执行程序 ...   
  4.  } finally {   
  5.      lock.release();   
  6.  }   
  7.  

IJobChangeListener 接口,监听到 Job 的状态信息,进而执行相应的逻辑操作。

ProgressProvider 类,为正在运行的 jobs 向 Job 管理器提供进度控制器。任何时候,它只有一个实例存在。该类仅由平台相关的插件内部使用。

【编辑推荐】

  1. Eclipse插件升级后不正常的问题解决方法(3.3.0版本)
  2. Eclipse JDT的自定义跳转功能
  3. 六大便捷Eclipse JDT特性一览
  4. 部署Eclipse RAP到Tomcat的步骤详解
  5. Eclipse 3.5插件安装与卸载的10个小窍门
责任编辑:yangsai 来源: IBMDW
相关推荐

2011-07-08 17:57:37

iPhone CoreData 数据库

2009-06-29 17:17:57

Spring

2009-07-09 16:33:06

eclipse jvm

2009-06-23 09:57:40

EclipsePerl脚本

2011-03-09 09:44:15

JavaMina框架

2017-08-04 11:41:53

Javathreadpool框架

2017-08-07 20:50:27

JavaForkJoin

2009-04-24 09:43:09

.NETASP.NET框架

2011-08-31 13:27:52

AndroidPhoneGap

2010-07-23 13:29:12

Perl脚本

2009-06-04 09:11:34

学习strutsstruts框架

2011-02-17 11:18:29

PythonWebRuby

2009-07-22 13:24:24

ASP.NET MVC

2012-06-25 09:28:42

.NET可逆框架

2009-06-17 17:44:41

Eclipse插件Sp

2013-07-08 14:45:52

2011-06-28 09:51:08

.NET对象相等

2009-06-26 14:04:15

Quartz配置

2017-08-28 15:21:29

异步处理回调函数异步编程

2009-03-11 15:30:05

evalwithJavascript
点赞
收藏

51CTO技术栈公众号