利用Timer写一个最简单的定时任务

本文详细介绍了Java中Timer类的使用方法,包括如何创建定时任务、设置定时任务的执行时间和频率,以及Timer和TimerTask的主要方法。同时对比了schedule与scheduleAtFixedRate两种方法的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先创建一个MyTimerTask类,让他继承TimerTask,实现run方法,run方法中写的就是这个所执行任务的业务逻辑。而这一整个类就是作为定时任务中的任务。

package com.csyd.timer;

import java.util.TimerTask;

/**
 * Created by ChengShanyunduo
 * 2018/3/1
 */
public class MyTimerTask extends TimerTask{


    private String name;

    public MyTimerTask(String inputName){
        name = inputName;
    }


    @Override
    public void run() {
        //打印当前name的内容
        System.out.println("我的Timer名字是:" + name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

然后再main函数中实例化一个Timer,在创建一个task。 Timer中要传进去3个参数,第一个参数是task,就是刚刚创建的类, 也就是你想要执行的事情,第二个参数是long型, 秒数, 代表要多久之后开始执行, 第三个参数也是秒数, 代表每隔多久执行一次。

import com.csyd.timer.MyTimerTask;

import java.util.Timer;

public class Main {

    public static void main(String[] args) {
        //创建Timer实例
        Timer timer = new Timer();
        //创建TimerTask实例
        MyTimerTask myTimerTask = new MyTimerTask("No.1");
        //t通过timer定时定频率调用myTimerTask的业务逻辑
        //当前时间的2秒钟之后每隔一秒钟执行一次
        timer.schedule(myTimerTask, 2000L, 1000L);

    }
}

这个定时任务执行出来就是,2秒之后, 每隔1秒打印一个task的名字No.1。


schedule的4种用法

1.schedule(task, time)

task(TimerTask):要执行的任务

time(Date):执行的时间(什么时候去执行),只执行一次,如果time早于现在的时间,就会立即执行。

2.schedule(task, delay)

task(TimerTask):要执行的任务

delay(Long):多久后去执行,只执行一次。比如如果delay的值为2000,task就会在距离当前时间2秒后去执行。

3.schedule(task, time, period)

task(TimerTask):要执行的任务

time(Date):第一次执行任务的时间

period(Long):每隔多久执行一次。比如period的值为2000,task就会在第一次执行之后,每隔2秒执行一次任务。

4.schedule(task, delay, period)

task(TimerTask):要执行的任务

delay(Long):多久后去执行

period(Long):每隔多久执行一次


scheduleAtFixedRate的2种用法

1.scheduleAtFixedRate(task, time, period)

task(TimerTask):要执行的任务

time(Date):第一次执行任务的时间

period(Long):每隔多久执行一次。比如period的值为2000,task就会在第一次执行之后,每隔2秒执行一次任务。

2.scheduleAtFixedRate(task, delay, period)

task(TimerTask):要执行的任务

delay(Long):多久后去执行

period(Long):每隔多久执行一次


schedule和scheduleAtFixedRate的区别

1.如果第一次执行的时间被delay,比如设定的执行时间为12:00:00,但timer开始执行的时候是12:00:06,schedule会以此顺延时间,第一次执行时间就变为了12:00:06,而scheduleAtFixedRate会按照上一次开始的时间计算,为了赶上进度会多次执行任务,以此需要考虑同步。

2.任务执行需要的时间如果超出时间间隔,比如这个任务执行完需要3秒,而timer中定的周期为2秒,schedule会将执行的时间以此顺延,也就是完成了一个3秒的任务后,继续完成下一个任务,并且不会间断。而scheduleAtFixedRate时间不会顺延,会有并发性。


其他方法

1.TimerTask中

cancel() —— 取消当前TimerTask里的任务,在TimerTask的run方法中使用。

timerTask.scheduledExecutionTime() —— 返回此任务最近执行的已安排执行的时间(也就是下一次执行的时间),返回值为long。

2.Timer中

timer.cancle() —— 结束当前计时器,取消所有任务。

timer.purge() —— 从该计时器的任务队列中移除所有已取消的任务,返回值为移除的任务数。


Timer定时器的缺点

1.管理并发任务:Timer里有且只有一个线程去执行定时任务,如果存在多个任务且任务时间过长,会导致执行效果与预期不符,无法并发。

2.任务抛出异常:如果TimerTask抛出RuntimeException异常,Timer会停止所有的任务。


不建议使用Timer的情况

1.对时效性较高的多任务并发作业。

2.对复杂的任务的调度。



学习视频:https://www.imooc.com/learn/841





要在Python中编一个定时任务,你可以选择多种方式。最常用的是利用内置模块 `threading.Timer` 或第三方库 `schedule` 和 `APScheduler`。这里我们分别介绍其中几种常见的做法,并给出简单示例帮助理解。 ### 方法1 - 使用 threading.Timer 创建一次性定时器 `threading.Timer` 是 Python 内置的一个轻量级工具,它允许你在指定的时间间隔后执行某项操作一次。如果你需要创建周期性的定时任务,则需结合循环结构手动管理任务重启。 **代码实例** ```python import threading def task(): print("这是一个每三触发的任务") timer = threading.Timer(interval=3, function=task) timer.start() # 启动计时器 # 若要取消尚未启动的任务: # timer.cancel() ``` 这种方法只适用于非常简单的场景并且只能设置单次延迟后的回调函数调用。如果希望每隔固定时间段自动重复该动作的话就需要额外设计了。 --- ### 方法2 - 利用 schedule 库 安排定期作业 `schedulue` 这个外部库非常适合于规划日常维护工作等规律性强的日程安排。安装很简单只需一行命令即可完成 pip install schedule 。然后就可以轻松设定每天、每周乃至每月的具体时刻来运行目标函数啦! **安装并使用 Schedule** 先通过pip下载包: ```bash pip install schedule ``` 再来看一段简短的例子: ```python import schedule import time def job(): print("这是按计划执行的工作") # 设置为每个整点触发job函数 schedule.every().hour.do(job) while True: schedule.run_pending() time.sleep(1) # 避免CPU空转浪费资源 ``` 这个例子会按照北京时间每一小时执行一次给定的功能;当然也可以自定义成其他频率如每日凌晨两点钟定点推送邮件提醒等等... --- ### 方法3 - APScheduler 先进调度框架 对于更为复杂的需求来说推荐采用 [APScheduler](https://github.com/agronholm/apscheduler),这是一款功能强大且易于使用的异步任务调度程序支持 Cron 表达式的完整特性集包括日期时间规则匹配以及分布式部署能力。 #### 主要特点包含但不限于以下几个方面: - 支持多线程和协程模式; - 提供丰富的日历表达式语法 (类似于 Unix crontab); - 能够保存持久化的待办事项列表以便恢复失败之后的状态信息继续未竟之事; - 更好的错误处理机制保证系统的稳定性与可靠性; **快速上手指南** 同样首先得装好依赖环境: ```bash pip install apscheduler ``` 接着参考下面的脚本片段尝试实现自己的第一个 APScheduler 示例吧! ```python from datetime import datetime from apscheduler.schedulers.blocking import BlockingScheduler def my_job(text): print(f'{text}. 时间戳:{datetime.now()}') sched = BlockingScheduler() # 添加一个新的 cron 类型 jobspec 指令 # 将会在星期一至周五下午三点正执行my_job('Good afternoon!') sched.add_job(my_job,'cron',day_of_week='mon-fri', hour=15, minute=0,args=['Good afternoon!']) try: sched.start() except KeyboardInterrupt: pass finally: sched.shutdown(wait=False) if __name__ == '__main__': try: while True: time.sleep(2) except KeyboardInterrupt: exit() ``` 以上三种方法各有优劣,您可以依据项目的实际需求选取最合适的技术方案。如果您想进一步了解有关如何构建高效可靠的后台服务系统或者探索更多高级特性和最佳实践案例,请随时查阅官方文档获取更多信息和支持哦~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值