我是靠谱客的博主 幽默学姐,最近开发中收集的这篇文章主要介绍定时器Timer使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、定时器Timer基本使用

  1. Timer timer = new Timer(); timer.schedule(TimerTask, Date);,任务需要用TimerTask封装,重写TimerTask中的run方法
  2. Timer timer = new Timer(boolean);,传值true表示Timer线程为守护线程,主线程结束跟随结束。默认值为false,主线程结束任务执行完毕仍未结束线程。
  3. 当前时间在Date之后则立即执行,在Date之前则等到指定时间后执行
  4. 同一Timer调用的不同定时任务按顺序执行
  5. 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) 方法

  1. 传入period表示每隔一段时间执行一次
  2. date在当前时间之后则按指定时间执行,在当前时间之前则立即执行
  3. 任务执行时间过长造成后续任务延时,后续任务按队列执行,例如定时每2s执行一次但是任务执行需要5s,则以后每5s执行一次。
  4. TimerTask.cancel()方法,将自身从任务队列中清除,其他任务不受影响。
  5. Timer.cancel()方法,将timer中的任务队列全部清空。注意有可能不会被清除,因为Timer.cancel()方法可能没有抢到任务队列queue的锁

schedule(TimerTask task, long delay) 延时执行

  1. 以当前时间为基准在delay毫秒后执行
  2. 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)对比

  1. 若任务不延时,传入Date时,上次任务执行开始时间+period为本次任务开始时间。传入long时,上次任务开始时间+period为本次任务的开始时间。scheduleAtFixedRate类似
  2. 若任务延时,传入Date时,上次任务结束时间+period为本次任务开始时间。传入long时,上次任务结束时间+period为本次任务的开始时间。scheduleAtFixedRate类似

scheduleAtFixedRate与schedule区别

  1. schedule不具有追赶性:当任务延时时间很长中间任务未被执行的任务就被取消掉不执行了。
  2. 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使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部