欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java编程自制毫秒级别定时器

程序员文章站 2022-04-15 23:08:10
自制毫秒级别定时器定时器的作用如果我们希望一个代码段或者一个函数以一定的时间间隔重复被调用,可以使用定时器调用。关于定时器的实现构思在自己做定时器前我们需要从用户使用角度和功能角度思考定时器的实现过程。1、 用户只用在初始化该定时器类的时候调用单餐构造,就可以决定代码段或函数段被重复调用的间隔时间;2、 用户要执行的代码段由用户自己完成,所以在定时器里应该有一个抽象方法,该方法完成此需求;3、 隔一定间隔就执行一个代码片段或函数调用,因此需要一个线程,这个线程经过一段时间就“醒来”,并执行外部...

自制毫秒级别定时器

定时器的作用

如果我们希望一个代码段或者一个函数以一定的时间间隔重复被调用,可以使用定时器调用。

关于定时器的实现构思

在自己做定时器前我们需要从用户使用角度和功能角度思考定时器的实现过程。
1、 用户只用在初始化该定时器类的时候调用单参构造,就可以决定代码段或函数段被重复调用的间隔时间;
2、 用户要执行的代码段由用户自己完成,所以在定时器里应该有一个抽象方法,该方法完成此需求;
3、 隔一定间隔就执行一个代码片段或函数调用,因此需要一个线程,这个线程经过一段时间就“醒来”,并执行外部要求的操作。

将构思转化为实际代码

对需求进行分析后,代码的完成就依照着需求来完成;
①在完成定时器时不仅需要无参构造(间隔时间为默认的间隔时间)也需要单参构造(可以实现将用户传进来的参数赋值给间隔时间),而无参构造调用单参构造;
②该定时器类中应有一个抽象方法,该方法由未来使用定时器的用户去完成,用来确定具体要调用的代码段;
③间隔调用一个代码段需要一个线程按间隔时间“苏醒”。

具体实现过程如下:

 public abstract class SimpleDida implements Runnable{ private static final long DEFAULT_DELAY = 1000; private volatile boolean goon; private long delay; private Object lock; public SimpleDida() { this(DEFAULT_DELAY); } public SimpleDida(long delay) { this.delay = delay; this.lock = new Object(); } public abstract void doing(); @Override public void run() { while(goon) { synchronized (lock) { try { lock.wait(delay); new InnerClass(); } catch (InterruptedException e) { goon = false; } } } } public void startUp() { if(goon == true) { return; } this.goon = true; new Thread(this).start(); } public void stop() { if(goon == false) { return; } this.goon = false; } public class InnerClass implements Runnable { public InnerClass() { new Thread(this).start(); } @Override public void run() { doing(); } } } 

如果我们将定时器中按时苏醒的线程成为”间隔线程“,那么每次”间隔线程“苏醒后便会调用内部类InnerClass产生一个新线程去调用用户需调用的代码段,以达到该代码段在用户需要的间隔时间就被执行一次的效果;

代码运行结果

在使用该定时器前我们首先要建立相应的DemoDiDaDida类,该类中完成需要重复被调用的代码段,具体测试过程如下:

 public class DemoDiDaDida { private SimpleDida dida; private static int times = 0; public DemoDiDaDida() { dida = new SimpleDida(50) { @Override public void doing() { int time = ++times; System.out.println("第" + time + "次开始" + System.currentTimeMillis()); try { Thread.sleep(600); } catch (InterruptedException e) { e.printStackTrace(); } } }; } public void start() { dida.startUp(); System.out.println("已启动"); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } dida.stop(); } public static void main(String[] args) { new DemoDiDaDida().start();; } }

在这里我们如果测试在总时长500ms内每间隔50ms执行一次doing()函数,测试结果如下:

 已启动
第1次开始15985419668082次开始15985419668593次开始15985419669104次开始15985419669605次开始15985419670116次开始15985419670627次开始15985419671138次开始15985419671639次开始159854196721310次开始1598541967264

当我们不传进间隔时间时,默认间隔时间为1000ms,在此情况下我们测试结果如下:

已启动
第1次开始1598542247879
相关标签: java 编程语言