Eclipse RCP:一次只运行一个Job?

时间:2009-12-09 02:30:30

标签: multithreading concurrency eclipse-rcp

Eclipse RCP中的Jobs API显然与我预期的工作方式大不相同。我认为创建和调度多个Jobs实际上会导致创建多个工作线程,并行执行Jobs,除非发生ISchedulingRule冲突。

我回过头来仔细阅读文档,并在JobManager类中发现了这条评论:

/**
 * Returns a running or blocked job whose scheduling rule conflicts with the 
 * scheduling rule of the given waiting job.  Returns null if there are no 
 * conflicting jobs.  A job can only run if there are no running jobs and no blocked
 * jobs whose scheduling rule conflicts with its rule.
 */

现在我觉得Job Manager只会尝试使用一个后台工作线程。我完全错了吗?如果我是对的,

  • 调度规则和锁定有什么意义?如果只有一个工作线程,那么乔布斯就永远不会相互预告。如果调用Job的sleep()方法(例如,在拿着Lock时睡觉),这些只会被用过吗?
  • 平台的任何部分是否允许两个作业实际在多个工作线程上同时运行,从而使上述功能在某种程度上有用?

我在这里缺少什么?

4 个答案:

答案 0 :(得分:2)

看一下documentation中的run方法,特别是这部分:

  

乔布斯可以选择完成他们的工作   异步执行(在另一个   线程)返回结果状态   ASYNC_FINISH完成的工作   异步必须指定   通过调用setThread执行线程,   并且必须在何时表明   通过调用方法完成。

ASYNC_FINISH看起来很有趣。

答案 1 :(得分:1)

AFAIK创建和调度多个作业DO实际上会导致创建多个工作线程并并行执行。 但是,如果为作业指定可选的调度规则(使用setRule()方法),并且该规则与另一个作​​业的调度规则冲突,则这两个作业不能同时运行。

答案 2 :(得分:0)

这个Eclipse Corner article提供了很好的描述以及Eclipse Job API的一些代码示例。 只有高级作业操作才需要IJobManager API,例如当你需要使用锁,在几个作业之间同步,终止作业等等。

答案 3 :(得分:0)

注意:Eclipse 4.5M4现在将包括一种支持具有限制的作业组的方法(2014年第4季度)

请参阅bug 432049

  

Eclipse提供了一个简单的Jobs API,以并行和异步方式执行不同的任务。 Eclipse Jobs的一个限制是没有简单的方法来限制用于执行作业的工作线程数   当快速连续安排许多作业时,这可能会导致线程池爆炸。由于它很容易使用Jobs来并行执行不同的无关任务,但很难实现数千个Jobs合作完成单个大任务。

     

Eclipse目前支持Job Families的概念,它提供了一种分组方式,支持整个系列的join,cancel,sleep和wakeup操作。

     

为了解决所有这些问题,我们建议一种简单的方法来对一组负责同一大任务的Eclipse作业进行分组。
  API将支持组中所有作业的限制,加入,取消,组合进度和错误报告,并且作业分组功能可用于重写性能关键算法以使用协作作业的并行执行。

您可以在this commit 26471fa

中查看实施情况