Timer

来源:互联网 发布:js的json字符串转数组 编辑:程序博客网 时间:2024/06/06 16:43
public class TimerDemo extends TimerTask {@Overridepublic void run() {System.out.println("task1");}public static void main(String[] args) {TimerDemo task1 = new TimerDemo();Timer t1 = new Timer();//对 Timer 对象最后的引用完成后,并且 所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生t1.schedule(task1, 1000);//程序并不会结束}}



/** * 调用 timer的cancle方法时如果任务已经在执行则不会终止该任务,这一点与task.cancle()相同 * @author DXtechnology * */public class TimerDemo extends TimerTask {@Overridepublic void run() {for(int i=0;i<5;i++){this.cancel();System.out.println("task1");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) throws InterruptedException {TimerDemo task1 = new TimerDemo();Timer t2=new Timer(false);t2.schedule(task1, 500);Thread.sleep(1000);t2.cancel();//任务继续执行但不会再接受其他任务t2.schedule(task1, 500);//Timer already cancelled.不会再接受task1System.out.println("结束");}}




public class TimerDemo extends TimerTask {@Overridepublic void run() {while(true){System.out.println("task1");}}public static void main(String[] args) {TimerDemo task1 = new TimerDemo();//设置为守护线程Timer t2=new Timer(true);t2.schedule(task1, 1000);System.out.println("结束");//程序结束,正在执行的任务也会终止}}

/** * 与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。计时器任务应该迅速完成。 * 如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程。因此,这就可能延迟后续任务 * 的执行,而这些任务就可能“堆在一起”,并且在上述不友好的任务最终完成时才能够被快速连续地执行。 * @author DXtechnology * */public class TimerDemo extends TimerTask {@Overridepublic void run() {for(int i=0;i<5;i++){System.out.println("task1");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("task1:"+System.currentTimeMillis());}public static void main(String[] args) {TimerDemo  task1 = new TimerDemo();TimerDemo2 task2 = new TimerDemo2();Timer t2=new Timer(false);t2.schedule(task1, 1000);t2.schedule(task2, 2000);System.out.println("结束");}}class TimerDemo2 extends TimerTask{@Overridepublic void run() {System.out.println("task2:"+System.currentTimeMillis());}}


/** * 如果任务安排为一次执行且还未运行,或者此任务安排为重复执行 * 返回true * @author DXtechnology * */public class TimerDemo extends TimerTask {@Overridepublic void run() {for(int i=0;i<5;i++){System.out.println("task1");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("task1:"+System.currentTimeMillis());}public static void main(String[] args) {TimerDemo  task1 = new TimerDemo();Timer t2=new Timer(false);//t2.schedule(task1, 1000);//    System.out.println(task1.cancel());//true    t2.schedule(task1, 1000, 1000);//重复执行    System.out.println(task1.cancel());//trueSystem.out.println("结束");}}


/** *  如果此任务安排为一次执行且已经运行,或者此任务尚未安排, *  或者此任务已经取消,则返回 false。(一般来说,如果此方法不允许发生一个或多个已安排执行,则返回 true。) * @author DXtechnology * */public class TimerDemo extends TimerTask {@Overridepublic void run() {for(int i=0;i<5;i++){System.out.println("task1");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("task1:"+System.currentTimeMillis());}public static void main(String[] args) throws InterruptedException {TimerDemo  task1 = new TimerDemo();Timer t2=new Timer(false);t2.schedule(task1, 1000);Thread.sleep(2000);        System.out.println(task1.cancel());//falseSystem.out.println("结束");}}

Timer里面有4个schedule重载函数,而且还有两个scheduleAtFixedRate:
void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
安排指定的任务在指定的时间开始进行重复的固定速率执行。
void scheduleAtFixedRate(TimerTask task, long delay, long period)
安排指定的任务在指定的延迟后开始进行重复的固定速率执行。
使用scheduleAtFixedRate的话,Timer会尽量的让任务在一个固定的频率下运行。比如,让一个Task每3秒钟执行一次,但是因为java不是实时的,所以,我们在上个程序中表达的原义并不能够严格执行,例如有时可能资源调度紧张4秒以后才执行下一次,有时候又3.5秒执行。如果我们调用的是scheduleAtFixedRate,那么Timer会尽量让你的secondTask执行的频率保持在3秒一次。所以就会有这样的情况:Task执行一次后,因为系统繁忙,之后的3.5秒后sTask才得以执行第二次,然后Timer记下了这个延迟,并尝试在下一个任务的时候弥补这个延迟,那么2.5秒后,secondTask将执行的三次。“以固定的频率而不是固定的延迟时间去执行一个任务”就是这个意思。


0 0
原创粉丝点击