我的应用程序中有几个实例。每个实例都有一个Timer对象,它会在一段时间后触发对象自己的方法。
由于这是一个简单的模拟应用程序,我打算允许它为计时器提供暂停/继续模拟功能以及“加速/降速”功能。
但是,如果我的所有实例都有自己独立的Timer对象,它们将全部独立运行,并且很难要求所有这些对象暂停然后继续。即使我循环遍历一个数组列表来调用每个实例来暂停/继续它的计时器,这绝对不是一个非常有效的方法。同样的问题适用于提升和降低计时器的整体速度。
似乎我应该在模拟世界中只有一个单独的计时器来控制所有实例,但这又会使事情变得非常复杂。
有哪些实现方法可以达到这样的要求?我正在使用Java作为我的应用程序。
谢谢!
答案 0 :(得分:3)
您始终可以使用事件驱动的方法。让每个对象注册为主控制器的监听器,当一个选项被更改时,只需触发一个事件,让所有实例自行更新。
答案 1 :(得分:0)
我肯定建议使用一个中央计时器。此外,您可以拥有一个集中式ArrayList
,您可以在其中注册需要由计时器触发的所有对象。对象可以实现一个接口,比如ITimerInvokeable
,方法timerTick()
或者沿着那些行的东西。当计时器滴答时,它可以遍历ArrayList
并在所有对象上调用timerTick()
。在计算上,这并不比在每个对象中都有一个计时器更昂贵,因为你最终会得到相同数量的方法调用(并且循环开销很小)。此外,您还可以节省资源,因为您没有大量的计时器在运行。
(这是一种事件驱动的方法,看起来类似于@Kyle的答案,但据我所知,他建议使用这些事件来传播计时器信息中的变化。)
答案 2 :(得分:0)
因为这是一个模拟,也许有比推出一堆Timer
更好的方法?也许你可以有一个单独的“时间”表示,可以在一段预设的时间后通知听众(或更简单的一个列表)。
所以,如果你的Timer
应该在5秒后熄灭,那么统一的时间持有者会在其“时间”的5个滴答后通知你的对象。
然后,您可以拥有一个只需要以您需要的任何粒度执行的计时器(例如,1秒表示1个刻度)。这样,如果你需要加速或减慢模拟速度,那么在单个Timer
关闭之后,你就会增加“滴答”而不是实时。因此,50%的速度每秒仅上升0.5个滴答。 200%的速度每秒上升2个滴答。
答案 3 :(得分:0)
集中计时器是最好的方法,但出于效率原因我不会这样做,但是因为它会简化集中控制。
集中这些计时器的一种方法是使用PriorityQueue。您可以将每个Timer添加到优先级队列,并从队列中重复获取下一个Timer。对于重复任务,请再次添加到队列中。您可以按照自己的意愿播放这些活动。 ;)
您可以在几分之一毫秒内调用一万个对象的方法。如果这就是你所担心的,也许你不需要改变。
答案 4 :(得分:0)
有点取决于你需要多少计时器。你当然可以用一个集中计时器处理的'OnTimeout'事件来实现一个超时对象列表。一个问题是 - 是否值得按超时时间排序列表?如果插入/移除/更改时间操作很少,并且“计时器”的数量很大,您可以保持列表的顺序,并且计时器只需要超时列表顶部的项目。然后,一个高分辨率计时器可以高精度地处理数百个“计时器”。缺点是insert / remove / changeTimeout需要重新排序列表。此外,如果定时器像系统定时器一样重复,则必须将触发定时器放回列表 - 另一个插入操作:(
不确定您的应用是否证明了这种delta-queue复杂性。
RGDS, 马丁