线程的延时调度
实现线程的延时调度需要两个对象,一个是负责对任务进行调度的调度对象 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] ,回复【面试题】 即可免费领取。