2009-12-09 74 views
3

Eclipse RCP中的Jobs API显然与我预期的不同。我认为创建和调度多个作业实际上会导致创建多个工作线程,并行执行作业,除非存在ISchedulingRule冲突。Eclipse RCP:一次只运行一个作业?

我回去,并更紧密地阅读文档,同时还发现了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的sleep()方法被调用的情况下才会被使用(例如,在持有锁的同时进行睡眠)?
  • 该平台的任何部分是否允许两个作业到实际上在多个工作线程上同时运行,从而使上述功能以某种方式有用?

缺少什么我在这里?

回答

2

看看run方法在documentation,特别是这部分:

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

ASYNC_FINISH那里看起来很有意思。

+0

实施,将作业管理仍执行调度规则被异步完成的工作?我希望它能做到(并且我认为这就是调用done()帮助完成的),但我想确定。 – 2009-12-09 05:57:17

+0

我不认为这是解决方案。我只有两个作业正在运行,我根本不使用async_finish。没有任何意义,因为“简单”作业也已经在其自己的线程中运行! – Zordid 2012-12-06 15:09:13

0

这个Eclipse Corner article为Eclipse Job API提供了很好的描述以及很少的代码示例。 IJobManager API仅用于高级作业操作,例如,当您需要使用锁时,在几个作业之间同步,终止作业等。

1

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

0

注:Eclipse的4.5M4现在将包括(Q4 2014)的方式为工作组与节流

以支持见bug 432049

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

Eclipse目前支持作业系列的概念,它提供了一种分组方式,支持全家人的加入,取消,休眠和唤醒操作。

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

你可以看到this commit 26471fa