【发布时间】:2011-11-13 20:15:05
【问题描述】:
我为这个问题的长度道歉,但我认为包含足够的细节很重要,因为我正在寻找一种合适的方法来解决我的问题,而不是简单的代码建议!
一般说明:
我正在开展一个项目,该项目需要能够以某个相对重复间隔“安排”任务。
这些间隔是根据一些内部时间来表示的,它表示为一个随着程序执行而递增的整数(因此不等于实时)。每次发生这种情况时,都会询问计划以检查是否有任何要在此时间步执行的任务。
如果一个任务被执行,它应该被重新安排在相对于当前时间的位置再次运行(例如,以 5 个时间步长)。这个相对位置被简单地存储为 Task 对象的一个整数属性。
问题:
我有点难以决定我应该如何构建这个 - 部分原因是它是一组稍微难以查找的搜索词。
就目前而言,我认为每次定时器增加时我都需要:
- 在计划中的“0”位置执行任务
- 将这些任务重新添加到计划中的相对位置(例如,每 5 步重复的任务将返回到位置 5)
- 计划中的每组任务的“执行前时间”将减一(例如,位置 1 的任务将移至位置 0)
假设:
有几个假设可能会限制我可以使用的可能解决方案:
- 间隔必须是相对的,而不是特定的时间,并且定义为从当前时间开始的整数步数
- 这些间隔可以采用任何整数值,例如没有界限。
- 多个任务可能安排在同一个时间步,但它们的执行顺序并不重要
- 所有执行都应保持在单线程中 - 由于其他限制,多线程解决方案不适合
我的主要问题是:
我怎样才能设计这个时间表以有效地工作?哪些数据类型/集合可能有用?
我应该考虑另一种结构/方法吗?
我是否错误地忽略了调度框架(例如 Quartz),它似乎在“实时”时域而不是“非实时”时域中工作得更多?
非常感谢任何可能的帮助。如有需要,请随时评论以获取更多信息,我会在需要的地方进行编辑!
【问题讨论】:
-
在我看来,您想通过计数器在应用程序中模拟时间。我想知道为什么您不想使用系统时间,即实时时间?
-
当然你可以用石英做到这一点,你以前用过石英吗。
-
@user384706 - 我在模拟情况下工作,每个时间步长可能需要非常不同的时间长度,因此表示为一个计数器。
-
@Java Ja Baby - 我以前没有使用过 Quartz,但据我所知,它更专注于“实时”调度(正如我在 OP 中所说)。这种信念是错误的吗?
-
我知道你有一个特定的问题,不想成为一个“痛苦”,但我想知道,你不能简单地在一个单独的类中对需要不同时间长度的每个时间步进行建模并安排它使用实时根据特定的班级间隔进行调度?
标签: java algorithm scheduling