通过有效的处理器使用来分配计划任务

时间:2011-09-05 14:20:00

标签: java multithreading threadpool

假设50K Runnables计划每30分钟无限期执行一次。 每个Runnable将花费1-5秒,并执行一个Socket操作。 TheadPool有200个尺寸。

现在如何使用scheduleWithFixedDelay调用确定每个50K Runnables的初始调用延迟(或)如何以处理器有效的方式调度这些Runnables。

是否存在用于分发这种调度的标准算法。

感谢。

2 个答案:

答案 0 :(得分:2)

如果您有50K Runnables,每个最长可达5秒,即250,000秒的工作时间。如果要每30 * 60秒运行一次,则需要在至少139个线程上运行此操作。如果使用200个线程,则可能需要20分钟才能执行它们。如果您希望在5分钟内完成这些任务,则可能需要更多线程。

简单的读或写不应该花费1-5秒。通过一个Socket操作你的意思是读或写,或者你的意思是打开一个套接字,发送一些数据并得到回复?后者可能涉及很多开销。

虽然50K很多,但我会有这么多计划任务,除非您需要尽可能在30分钟的时间间隔内运行任务。如果您有50K独立任务,它们将大约每30分钟运行一次,但彼此在不同时间运行。这在某种程度上是不可避免的,因为你没有50K内核,但你最关心的是如何尽可能地运行它们?

答案 1 :(得分:0)

根据您的时间限制分发日程安排可能是最佳选择。

如果你有30分钟,那就是计划和完成所有50000个工作的1800秒。

因此,考虑到完成上一轮工作的时间,你有50000 /(1800-5)。

这相当于每秒完成大约28个(四舍五入)的工作。因此,一个简单的方法就是每秒安排至少28个工作岗位。这样可以在指定时间内完成所有工作,同时最大限度地减少资源消耗。我们不需要担心套接字操作的线程池大小,因为如果操作在最长5秒的时间内完成,则以这种方式发生的最大同时套接字操作数将为140.

显然,实施这样的时间表将是一个简单的for循环,从0到1794,作为调度一定数量的作业的延迟时间,在这种情况下为28.随后是在再次开始之前舍入到30分钟标记的延迟。