java多线程入门(四)定时器timer的使用

314 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

  • 定时任务在做开发的时候都会用到,特别在接口中。
  • 下面介绍下Java自带的定时器

使用方法介绍

  • Timer timer=new Timer(true);//设置为守护线程 不设置的话线程会一直存在的
  • 在指定的延迟后安排指定的任务执行。
  • Timer.schedule(TimerTask task, long delay)
  • 在指定的延迟之后开始,为重复的固定延迟执行安排指定的任务。
  • Timer.schedule(TimerTask task, long delay, long period)
  • 计划在指定时间执行指定的任务。
  • Timer.schedule(TimerTask task, Date time)
  • 从指定时间开始,为重复的 固定延迟执行 安排指定的任务。
  • Timer.schedule(TimerTask task, Date firstTime, long period)
  • 在指定的延迟之后开始,为重复的 固定速率执行安排指定的任务
  • Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)
  • 从指定时间开始,为重复的 固定延迟执行 安排指定的任务
  • Timer.scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

入门demo

public class TestTimer extends TimerTask{

	@Override
	public void run() {
		System.out.println("定时器执行了");
	}

	public static void main(String[] args) throws InterruptedException {
		TestTimer tt=new TestTimer();
		Timer timer=new Timer(true);
//		timer.schedule(tt, 10);
//		timer.schedule(tt, 10,10);
//		timer.schedule(tt, new Date());
//		timer.schedule(tt, new Date(),10);
//		timer.scheduleAtFixedRate(tt, 10, 10);
		timer.scheduleAtFixedRate(tt, new Date(), 10);
		Thread.sleep(10000);
	}
}

注意事项

  • 创建一个 Timer 对象相当于新启动了一个线程
  • 当TimerTask 抛出异常后 定时任务将不再执行
  • 当timer设置的时间提前的话,会立即执行
  • this.cancel(); 移除当前的定时任务,这里可以用作线程的终止,重启可以重新调用
  • timer.cancel();移除当前timer的所有定时任务
  • 没有延时schedule会参考上次执行的开始时间、而scheduleAtFixedRate会参考上次执行的结束时间
  • 如果有延时的时候都会参照上次结束时间的,schedule向后延时,scheduleAtFixedRate会选择就近原则 执行
  • 一个Timer内部包装了一个Thread和一个Task队列,里面会轮询执行的。当队列为空等待结束后,当前的定时器也就结束了