处理

时间:2017-01-01 22:11:23

标签: java multithreading timer scheduledexecutorservice

我想编写一个为不同对象维护许多计时器的类,它能够在计时器结束时通知甚至运行任务,并且能够取消计时器。

例如,如果我有一个X类型的对象x,其中3秒计时器代表事件E,我希望能够: 1.知道什么时候结束并做些什么 2.如果需要,在它到期之前取消它

我自己实施了一些东西,但我相信图书馆可以提供更多。

我查看了ScheduledPoolExecutor,但由于几个原因,这不符合我的需求,比如我可能是单线程并且能够将“自己的”线程传递给它。

我也查看了Timer,但它在后台有一个Thread用于每个Timer实例,这是一个我不能允许的大开销。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

许多可能的解决方案之一可能是让你想要的每个对象都从下面的Timeable继承(或定义一个接口或抽象类)。

拥有一个由java Timer类每秒调用一次的线程。计时器的线程将访问它遍历的Timeable对象的列表,并调用quantum()方法从其剩余时间中扣除。在其他地方调用setSecondsRemaining()以向对象提供delta到超时值,并将其添加到正在计时的对象列表中。如果要取消对象上的计时器,请调用它的cancelTimer()方法。

如果你需要高精度的时间,那么你需要考虑对象列表的长度,超时线程走到该列表需要多长时间并做一些工作以确保无论什么时候活动在你的Timer线程上启动你在一秒钟内完成所有工作,并且在下一轮完成之前不要开始。或者您可以使用不同的tick-tock值,例如10秒。处理这个问题的方法很多。

以下只是帮助您理解概念的一个粗略示例,但尚未编译,显然不是完整的解决方案。

基类(超类):

public class Timeable {

    long secondsRemaining;

    Timeable() {}

    void setSecondsRemaining(long secondsRemaining) {
        self.secondsRemaining = secondsRemaining;
    }

    long getSecondsRemaining() {
        return secondsRemaining;
    }        

    void cancelTimer() {
        secondsRemaining = 0;
    }

    void subtractQuantum() {
        if (secondsRemaining == 0)
             return;
        if (--secondsRemaining == 0) 
             timeout();
    }

    void timeout() {
         // default timeout handling here - can be overriden by child
    }
}