Didadida计时器
定时器,一种用于控制时间的仪表,以达到准确控制时间的目的,使很多需要人控制时间的工作变得简单。
现在我们就通过JAVA来简略制作一个定时器。
首先我们要明确我们这个定时器的职责(应该做那些事?),定时器是为了方便用户控制时间片段,但后面用户干嘛我们管不着,也不应该改。所以具体要定多少的时间片段应该由用户自己定,当然我们也必须防止某些不应该出现的错误,既用户没有设置这个时间,那么我们也应该给一个默认的“延迟时间”,避免不必要的麻烦。
大概的方向确定好了,那么就应该开始编程了。
1:先要知道我们做的这个工具是一个单独的线程,应该一直都在做“定时”这个操作,是独立于主线程的,所以我们肯定离不开线程的问题;
2:如何完成“定时”,其实我们只需要运用JAVA中提供的wait(long timeout)方法既可,这里不使用sleep(long millis)方法的原因是,该方法会一直占用CPU,什么事都不干,其他进程也不能使用CPU,很恶心!wait(long timeout)的用法是,当一个线程使用这个方法时,除非被提前唤醒,不然就会使该线程进入阻塞态,直到“timeout”时间后,该线程才会被唤醒,进入就绪态,但这里存在一个竞争CPU的一个过程,所以会出现几毫秒的偏差。
代码如下:
这下,我们就完成了第一步定时,那么接下来就该给用户提供一个抽象方法,让用户去定要完成的事,到这里,可能有些人认为只需要在wait方法后加上一个抽象方法就够了,其实这样的想法还有所欠缺,如果执行用户定义的方法所消耗的时间超过了我们的“延迟时间”,那么实际的时间间隔就会产生很大的误差,因此,我们可以给一个内部类来产生另一个线程,并且让该线程一开始就进入阻塞态,等到“延迟时间”过了之后,再唤醒该线程,就差不多了。代码如下:
就此,定时器大致已完成,但还有一些值得注意的地方。
两个线程都应该由同一个boolean变量控制,即goon,而且为了防止线程安全的问题,我们应该给这个变量加上volatile关键字,防止JVM的寄存器优化。
至此,定时器就告一段落了,谢谢大家的观看!
本文绝对原创!若有意见或建议欢迎指出。