2010-05-27 83 views
4

我已经堆积数周试图找到一个解决方案。我一遍又一遍地回到相同的地方。 Java的ScheduledThreadPoolExecutor 的替代品...但没有任何做到这一点。我需要一个java调度程序与其他调度程序共享一个线程池

我要的是执行syncrhonized /串行调度内部人员,有很多做调度的那independentely彼此,由一个单一的线程池的支持...

我在Java和什么样的服务器应用程序我需要的是创建数百和数千个调度程序。

我想每个调度执行其串行和syncrhonized工作。

所有的调度程序可以同时独立运行,但我还需要通过使用线程池(不是每个调度程序的线程池,而是所有调度程序的一个线程池!)来限制所有调度程序的线程数。 此外,暂停/恢复作业并将它们放入组中的功能会很好。 任何解决方案?提前致谢!

+1

为什么你需要这么多的调度程序?事实上,你为什么要多过一个?许多*工作*是,但许多调度员?为什么? – skaffman 2011-02-12 17:20:38

回答

0

如果您希望作业在ScheduledThreadPoolExecutor内连续执行,您只需创建一个聚合作业,以串行方式执行每个实际作业并将其提交给ScheduledThreadPoolExecutor。虽然如果你需要数千个调度程序同时运行,但仍然限制不了。的线程,你可能会遇到麻烦 - 至少如果这些工作需要很长的时间才能执行,所以你开始滑动你的计划。

我说你应该看看Quartz处理这一点,因为它会处理大部分的调度和作业的血淋淋的细节。

+0

你好! 感谢您的回答。 我对使用ScheduledThreadPoolExecutor和聚合作业的解决方案很感兴趣。这是我有时在想的事情,但我对实施有一些严肃的问题。 1.如何创建包含延迟实际工作的聚合作业? 2.这个聚合作业如何执行它们中的每一个......每次在实际作业列表中循环查看哪一个需要执行? 3.这是不是有效?它应该如何提交(聚合作业)到ScheduledThreadPoolExecutor?使用延迟?或不? 谢谢! )) – alexei 2010-05-27 12:34:04

+0

1.通过汇总工作,我想到了一系列连续运行的作业,一个接一个地运行。这听起来像你有一系列延迟不同的工作 - 你是否真的需要这些“连续”执行? 2.不要那样做。 3.如果您希望在某个延迟后执行作业,请使用延迟,否则请勿延迟。 – nos 2010-05-27 12:54:30

+0

首先请原谅我的英语。 1.通过说串行执行我的意思是任务之间的同步执行。我不希望我的实际工作同时执行。 2.问题是如何去做。如果不通过循环任务列表,那么该怎么做? 3.关于这一个确定;) – alexei 2010-05-27 13:07:18

0

我试图自己找到这样的解决方案。在.Net世界中,你有一个由系统提供的中心共享线程池,它动态扩展和缩小。我的情况是,我有很多低频维护类型的工作,一个线程应该能够处理它们。

我想你可以有一个单独的Executor(线程池版本)的地方,并经常用它来安排任务。这将模仿.Net行为。

1

你有没有使用HawtDispatch和大量的串行队列的考虑? 它听起来像它可能会做的,只需一个简单的API。我一直在考虑自己尝试。据我了解,Akka项目使用它。

+0

其实,我的意思是说“阿卡”。 – 2010-08-28 13:21:54

+1

你可以使用'edit'链接编辑你的答案。 – BalusC 2010-08-28 13:36:03

0

也许一个独立的调度,如Quartz Scheduler将服务器您的需求?

+0

石英的开销比大多数线程池/调度程序高得多,所以我不认为这是在正确的球场。 – 2011-02-12 17:15:28

2

你需要www.dhtmlx.com/x/download/regular/dhtmlxConnector_v09_java.zip什么是许多调度程序和一个执行程序。调度程序不应该自己执行任务,而是将它们提交给执行程序。调度程序可以实现为java.util.Timer任务。

+0

其他细节将会有用。或者至少是一个到java.util.Timer的链接 – 2012-12-07 04:57:37

1

您可以使用HawtDispatch线程库。它提供了一个libdispatch风格的API。 对于您的用例,您需要为每组需要串行执行的任务创建一个串行队列。然后安排要在其上执行的任务。例如:

DispachQueue q1 = createQueue(); 
DispachQueue q2 = createQueue(); 
... 
DispachQueue qN = createQueue(); 

Runnable task = ... 
qN.execute(task) 
// or to execute in the future 
qN.dispatchAfter(1, TimeUnit.SECOND, task) 

所有队列都使用共享线程池。