概述
一、定时器Timer基本使用
- Timer timer = new Timer(); timer.schedule(TimerTask, Date);,任务需要用TimerTask封装,重写TimerTask中的run方法
- Timer timer = new Timer(boolean);,传值true表示Timer线程为守护线程,主线程结束跟随结束。默认值为false,主线程结束任务执行完毕仍未结束线程。
- 当前时间在Date之后则立即执行,在Date之前则等到指定时间后执行
- 同一Timer调用的不同定时任务按顺序执行
- Timer可能会延时执行,使用同一个Timer调用schedule()方法,第一个线程执行时间较长,等第二个执行时已经过了预设时间,立即执行。
import java.util.*;
class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("MyTask运行时间:" + new Date());
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class StudyThreads01Timer用法 {
public static void main(String[] args) {
System.out.println("当前时间:" + new Date());
// 设置运行时间,若运行时间在当前时间之前则立即执行,否则到指定时间后执行
Calendar calendar = new GregorianCalendar();
calendar.add(Calendar.SECOND, 5);
Date runDate = calendar.getTime();
MyTask myTask = new MyTask();
calendar.add(Calendar.SECOND,10);
Date runDate2 = calendar.getTime();
MyTask myTask2 = new MyTask();
System.out.println("任务1计划时间:"+runDate);
System.out.println("任务2计划时间:"+runDate2);
// 创建Timer对象,可传值Boolean 表示是否为守护线程(主线程结束跟随结束)
// 不是守护线程主线程结束 定时任务线程仍不会结束。是守护线程时不管定时任务线程是否执行都会结束
Timer timer = new Timer();
timer.schedule(myTask, runDate);
Timer timer2 = new Timer();
timer2.schedule(myTask2 , runDate2);
}
}
二、schedule(TimerTask task, Date firstTime, long period) 方法
- 传入period表示每隔一段时间执行一次
- date在当前时间之后则按指定时间执行,在当前时间之前则立即执行
- 任务执行时间过长造成后续任务延时,后续任务按队列执行,例如定时每2s执行一次但是任务执行需要5s,则以后每5s执行一次。
- TimerTask.cancel()方法,将自身从任务队列中清除,其他任务不受影响。
- Timer.cancel()方法,将timer中的任务队列全部清空。注意有可能不会被清除,因为Timer.cancel()方法可能没有抢到任务队列queue的锁
schedule(TimerTask task, long delay) 延时执行
- 以当前时间为基准在delay毫秒后执行
- schedule(TimerTask task, long delay, long period) 以当前时间为基准在delay毫秒后执行,每period时间执行一次
schedule(TimerTask task, long delay, long period)与schedule(TimerTask task, Date date, long period)与scheduleAtFixedRate(TimerTask task, Date date, long period)与scheduleAtFixedRate(TimerTask task, Date date, long period)对比
- 若任务不延时,传入Date时,上次任务执行开始时间+period为本次任务开始时间。传入long时,上次任务开始时间+period为本次任务的开始时间。scheduleAtFixedRate类似
- 若任务延时,传入Date时,上次任务结束时间+period为本次任务开始时间。传入long时,上次任务结束时间+period为本次任务的开始时间。scheduleAtFixedRate类似
scheduleAtFixedRate与schedule区别
- schedule不具有追赶性:当任务延时时间很长中间任务未被执行的任务就被取消掉不执行了。
- scheduleAtFixedRate具有追赶性,当任务延时时间很长中间任务会进行补充行执行。
scheduleAtFixedRate测试代码:
package com.chapter05;
import java.util.*;
class MyTask02 extends TimerTask {
@Override
public void run() {
System.out.println("MyTask运行时间:" + new Date());
}
}
public class StudyThreads02scheduleAtFixedRate方法 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND, -20);
Date runDate = calendar.getTime();
System.out.println("当前时间:" + new Date());
System.out.println("计划执行时间:" + runDate);
MyTask02 myTask02 = new MyTask02();
Timer timer = new Timer();
timer.scheduleAtFixedRate(myTask02, runDate, 2000);
}
}
运行结果:
最后
以上就是幽默学姐为你收集整理的定时器Timer使用的全部内容,希望文章能够帮你解决定时器Timer使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复