2023-06-14  阅读(3)
原文作者:求和的小熊猫 原文地址:https://blog.csdn.net/qq_38219153/article/details/108470258

线程的延时调度

实现线程的延时调度需要两个对象,一个是负责对任务进行调度的调度对象 Timer,另一个是继承了 TimerTask 对象的自定义的延时调度对象

简单代码示例

延时调度任务对象

该对象是需要被延时调度的任务

    public class ScheduleTask extends TimerTask{
    
    	@Override
    	public void run() {		
    		System.out.println("执行任务" + new Date());		
    	}
    
    }

调度任务

    public class Schedule {
    
    	public static void main(String[] args) {
    		Timer t = new Timer(); // true 是设置守护线程,这可以保证在执行完调度后可以顺利结束线程。
    		ScheduleTask task = new ScheduleTask();
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    		Date date = null;
    		try {
    			System.out.println(new Date());
    			date = sdf.parse("2021-01-18 16:35:55");
    			t.schedule(task, date);
    		} catch (ParseException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    
    	}
    
    }

Timer 对象 API 简单介绍

Timer 对象本身就会创建一个线程,用来进行延时任务的调度。但是默认情况下,该线程不是守护线程,因此在不设置守护线程的情况下,该线程不会结束。

构造函数

Timer 对象有以下四个构造函数

  • Timer()
  • Timer(boolean isDaemon)
  • Timer(String name)
  • Timer(String name, boolean isDaemon)

其中 name 是设 Timer 中定时任务线程的名称,isDeamon 是设置对定时任务进行调度的线程 (即 Timer 对象自身所拥有的线程,不是事先 TimerTask 对象的线程) 是否为守护线程。

调度函数

Timer 定时任务的调度函数有以下六个

  • schedule(TimerTask task, long delay)
  • schedule(TimerTask task, Date time)
  • schedule(TimerTask task, long delay, long period)
  • schedule(TimerTask task, Date firstTime, long period)
  • scheduleAtFixedRate(TimerTask task, long delay, long period)
  • scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

其中 task 是需要被延时调度的任务。delay 是指从 Timer 开始运行时,延时的时间。time 指的是指定时调度任务的时间,如果时间为之前的时间的话,则会立即执行调度任务。period 是循环执行的间隔时间。

schedule 和 scheduleAtFixedRate 在延时的情况下没有区别。 但是在设定时间在之当前运行环境之前的话,那么调用 timer.cancel 犯法会呈现不同的状况。schedule 会立刻停止执行,但是 scheduleAtFixedRate 会执行从设定时间到停止运行所时间段所有的次数。假如是设定调度时间是timer开启调度的前10s进行调度,调度执行的周期为 2S,在执行10S 后取消调度。那么schedule 方法只会执行5次,但是scheduleAtFixedRate 方法会执行 10 次。也就是所谓的追加执行。

用通俗易懂的话来说就是,进考场考试,考试开始时间是在 8:00,收卷时间在 10:00,cancel 方法就是收卷的行为,假如你迟到到 8:30 赶到考场,schedule 方法就是 10:00 准时收卷,scheduleAtFixedRate 方法就是让你考满 2 个小时


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文