java timer 失效_Java定时器问题实例解析

定时器问题

定时器属于基本的基础组件,不管是用户空间的程序开发,还是内核空间的程序开发,很多时候都需要有定时器作为基础组件的支持。一个定时器的实现需要具备以下四种基本行为:添加定时器、取消定时器、定时器检查、到期执行。

请设计一个定时器并实现以下三种基本行为,函数原型已给出,可使用任意编程语言设计数据结构及实现,并尽可能高效地支持大量定时器:

// 添加定时器:经过特定时间间隔后执行目标操作

// 输入 1:Interval 定时器时间,单位ms

// 输入 2:ExpiryAction 目标操作

// 返回:定时器 Id

StartTimer(Interval, ExpiryAction) -> TimerId

// 取消定时器

// 输入:定时器 Id

StopTimer(TimerId)

// 定时器检查

// 系统每隔 10ms 会调用一次该函数

PerTickBookkeeping()

话不多说,直接上代码:

1)Timer.java:

import java.util.ArrayList;

public class Timer {

private long interval; // 定时器时间,单位 ms

private String expiryAction; // 目标操作

private int timerId; // 定时器Id

private long waitTime; // 定时器等待时间

// 构造函数

public Timer(){

this.waitTime = 0;

}

// 添加定时器

public int StartTimer(long interval, String expiryAction, int id){

this.interval = interval;

this.expiryAction = expiryAction;

this.timerId = id;

return timerId;

}

// 取消定时器

public void StopTimer(int timerId, ArrayList timer){

timer.remove(timerId);

}

// 定时器检查

public void PerTickBookkeeping(){

if (this.interval > this.waitTime)

this.waitTime += 10;

else{

System.out.println("定时器"+this.timerId+":"+this.expiryAction);

this.waitTime = 0;

}

}

public long getInterval() {

return interval;

}

public void setInterval(long interval) {

this.interval = interval;

}

public String getExpiryAction() {

return expiryAction;

}

public void setExpiryAction(String expiryAction) {

this.expiryAction = expiryAction;

}

public int getTimerId() {

return timerId;

}

public void setTimerId(int timerId) {

this.timerId = timerId;

}

public long getWaitTime() {

return waitTime;

}

public void setWaitTime(long waitTime) {

this.waitTime = waitTime;

}

}

2)DoTimer.java:

import java.util.ArrayList;

import java.util.Iterator;

public class DoTimer extends Thread {

private static ArrayList timerList;

public static void main(String[] args){

timerList = new ArrayList();

Timer timer1 = new Timer();

timer1.StartTimer(3000, "我是第一个定时器,等待3秒", 0);

Timer timer2 = new Timer();

timer2.StartTimer(4000, "我是第二个定时器,等待4秒", 1);

timerList.add(timer1);

timerList.add(timer2);

//public void run(){}

new Thread(){

@Override

public void run() {

while(true){

Iterator it = timerList.iterator();

while(it.hasNext()){

it.next().PerTickBookkeeping();

}

try {

sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}.start();

timer1.StopTimer(timer1.getTimerId(), timerList);

}

}

希望本篇文章可以帮助到您

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值