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

Java定时器问题实例解析

程序员文章站 2024-02-29 22:01:16
定时器问题   定时器属于基本的基础组件,不管是用户空间的程序开发,还是内核空间的程序开发,很多时候都需要有定时器作为基础组件的支持。一个定时器的实现需要具备以下四种基本...

定时器问题

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

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

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

  // 输入 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){
  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<timer> timerlist;
 public static void main(string[] args){
  timerlist = new arraylist<timer>();
  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<timer> 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);
 }
}

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