一个简单的定时器

package com.boz;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import java.util.concurrent.*;

import javax.swing.Timer;

public class TimerTask  {
	ExecutorService pool;
	private static TimerTask timeTask=null;
	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub
		TimerTask t=TimerTask.getTimerTask(10);
		for(int i=0;i<1000;i++){
			t.AddTask(500, new task(i));
		}
		Thread.currentThread().sleep(100000);
	}
	private TimerTask(int n) {
		// TODO Auto-generated constructor stub
		//初始化线程池
		this.pool=Executors.newFixedThreadPool(n);
	}
	//如果没有初始化TimerTask类,则使用n作为线程池参数初始化线程;
	public static TimerTask getTimerTask(int n){
		if(TimerTask.timeTask==null){
			TimerTask.timeTask=new TimerTask(n);
		}
		return TimerTask.timeTask;
	}
	
	public Timer AddTask(int ms,Runnable obj){//添加定时任务,该定时任务
		Timer t=new Timer(ms,new TimerTaskAction(obj));
		System.out.printf("%s %s%n", new Date().toString(),"start Timer");
		t.start();
		return t;
	}
	
	
	class TimerTaskAction implements ActionListener{//定时任务的事件监听器只是简单的将任务对象添加到线程池中
		private Runnable obj=null;
		public TimerTaskAction(Runnable Obj){
			this.obj=Obj;
		}
		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			pool.submit(this.obj);
		}
		
	}

}

class task implements Runnable{//该任务必须实现Runnable接口
	private int n=0;
	public task(int iN){
		this.n=iN;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.printf("%s %d%n", new Date().toString(),this.n);
	}
	
}

<div class="iteye-blog-content-contain" style="font-size: 14px"></div>

 鉴于java中定时器都会因为某个任务的执行缓慢而导致后面的任务不断延迟。所以编写了下面一个小程序做了一个延迟小的定时器。

说明:定时器使用javax.swing.Timer作为基础定时器,它在定时到达时会将任务添加到线程池FixedThreadPool中,任务由线程池运行。

疑问:javax.swing.Timer定时器从执行start到定时器触发有2到3秒的延迟。例如在第1秒执行start,定时为1000ms的情况下监听器会在第4第5秒执行;

猜你喜欢

转载自boz-0.iteye.com/blog/2215003