Timer定时器用法详解

   日期:2020-05-02     浏览:100    评论:0    
核心提示:先看API和结论:/**timer总结:Timertimer=newTimer();//其中会调用tJava

先看API和结论:

再看测试代码:

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class TimerTest {

	public static void main(String[] args) {
//		test1();		//测试schedule功能
//		test2();		//测试所有scheduleAtFixedRate功能
//		test3();		//测试isDeamon对Timer的影响
//		test4();		//测试AtFixedRateSchedule和schedule区别
//		test5();		//测试schedule在过去时间的表现, 如果firstTime是过去时间, 则立即执行, 如果是未来时间, 则会等待时间到之后执行, 如果是传入延迟时间, 则延迟时间不能为负数, 否则报错
//		test6();		
		test7();
	}
	
	public static void test1()
	{
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println("执行了1次");
			}
		}, 1000);
		
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println("执行了2次");
			}
		}, getDelayTime(2));
		
		//第3和第4个task的执行顺序是不确定的,因为时间片的切换导致的微小差别
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println("执行了3次");
			}
		}, getDelayTime(3), 1000);	//3, -3
		
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.err.println("执行了4次");
			}
		}, 1000, 1000);
	}
	public static void test2()
	{
		Timer timer = new Timer();
		timer.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				System.out.println("AtFixedRate1");
			}
		}, getDelayTime(1), 1000);
		
		timer.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				System.out.println("AtFixedRate2");
			}
		}, 2000, 1000);
	}
	
	public static void test3()
	{
		Timer timer = new Timer("isDeamon", true);
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println("isDeamon");
				try {
					Thread.sleep(10000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}, getDelayTime(2), 2000);
	}
	
	public static void test4()
	{
		Timer timer = new Timer("AtFixedRate", false);
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println("schedule");
			}
		}, getDelayTime(-5), 2000);
		
		timer.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				System.out.println("scheduleAtFixedRate");
			}
		}, getDelayTime(-5), 2000);
	}
	
	public static void test5()
	{
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println("测试时间为过去时间和将来时间对schedule的影响");
			}
		}, getDelayTime(-5));	//立即执行
	}
	
	public static void test6()
	{
		//purge: 清洗, 净化
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println("测试purge1");
			}
		}, getDelayTime(1), 1000);
		System.out.println("purge: "+timer.purge());
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println("测试purge2");
			}
		}, getDelayTime(1), 1000);
	}
	
	public static void test7()
	{
		//将7和6对比看
		Timer timer = new Timer();
		class MyTimerTask extends TimerTask{
			@Override
			public void run() {
				System.out.println("测试purge1");
				this.cancel();
			}
		}
		for(int i = 0; i<100; i++)
		{
			MyTimerTask mt = new MyTimerTask();
			timer.schedule(mt, getDelayTime(1), 1000);
			mt.cancel();
		}
//		timer.cancel();
		System.out.println("此时可以移除取消的任务数为100个: "+timer.purge());
		
		
		////////////////////////////////////////
		for(int i = 0; i<100; i++)
		{
			MyTimerTask mt = new MyTimerTask();
			mt.cancel();
			timer.schedule(mt, getDelayTime(1), 1000);
		}
		System.out.println("此时可以移除取消的任务数为100个: "+timer.purge());
		///////////////////////////////////////
	}
	
	//给定一个时间,返回给定多久以后的Date
	public static Date getDelayTime(int howlong)
	{
		Calendar cld = Calendar.getInstance();
		cld.set(Calendar.SECOND, howlong+cld.get(Calendar.SECOND));
		return cld.getTime();
	}
}

其中难点只有这个purge的使用,下面这篇文章详细解释了purge在queue队列非常大时如何避免内存泄漏的

Java定时任务Timer调度器【三】 注意事项(任务精确性与内存泄漏)

这里有个问题待考虑:为什么purge()返回值一直是0,我已经将TimerTask任务取消,但是返回的purge()还是0.这点很奇怪。

其他类似文章:

定时器Timer

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服