欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Java 使用定时任务 - 前言:Java 开发过程中经常会遇到使用定时任务的情况,如在某个活动结束时自动生成获奖者名单、导出 excel 等。常见的有以下四种方式:Timer、ScheduledExecutorService、SpringTask、Quartz。 实现 Java 定时任务的四种方法 (1) JDK 自带定时器实现 (2) Spring Task @Scheduled 注解任务调度 (3) Quartz 定时器实现 (4) Elastic-job 分布式任务调度框架 JDK 自带 .NET Framework 2.0JDK 自带 Timer 和 JDK1.5 + 新 ScheduledExecutorService; Spring3.0自带的任务调度工具:它可以看做是一个轻量级的Quartz,而且使用起来比Quartz简单得多,一般可以直接用@Scheduled+corn表达式来注解实现; Quartz:简单但功能强大的 JAVA 作业调度框架; Elast

最编程 2024-07-10 07:54:08
...

(1)由于执行任务的线程只有一个,所以如果某个任务的执行时间过长,那么将破坏其他任务的定时精确性。如一个任务每1秒执行一次,而另一个任务执行一次需要5秒,那么如果是固定速率的任务,那么会在5秒这个任务执行完成后连续执行5次,而固定延迟的任务将丢失4次执行。

(2)如果执行某个任务过程中抛出了异常,那么执行线程将会终止,导致Timer中的其他任务也不能再执行。

(3)Timer使用的是绝对时间,即是某个时间点,所以它执行依赖系统的时间,如果系统时间修改了的话,将导致任务可能不会被执行。

由于Timer存在上面说的这些缺陷,在JDK1.5中,我们可以使用ScheduledThreadPoolExecutor来代替它,使用Executors.newScheduledThreadPool工厂方法或使用ScheduledThreadPoolExecutor的构造函数来创建定时任务,它是基于线程池的实现,不会存在Timer存在的上述问题,当线程数量为1时,它相当于Timer。


3、JDK自带的ScheduledThreadPoolExecutor来实现

 /**
     * ScheduledThreadPoolExecutor 有两种创建方式:第一种,通过Executors创建;第二种:通过构造方法
     * scheduleAtFixedRate(Runnable command, long initialDelay, long period,TimeUnit unit)
     * initialDelay 首次执行任务的延迟时间
     * period  每次执行任务的间隔时间
     * unit   执行的时间间隔数值单位
     * 间隔单位毫秒:TimeUnit.MILLISECONDS 
     * 间隔单位秒:TimeUnit.SECONDS 
     * 间隔单位分钟:TimeUnit.MINUTES 
     * 间隔单位小时:TimeUnit.HOURS 
     * 间隔单位天:TimeUnit.DAYS
     */
    public static void timer5(){
        ScheduledThreadPoolExecutor scheduled = (ScheduledThreadPoolExecutor)Executors.newScheduledThreadPool(10);
//        ScheduledThreadPoolExecutor  scheduled = new ScheduledThreadPoolExecutor(10);
        scheduled.scheduleAtFixedRate(new Runnable() {
             @Override
             public void run() {
                 System.out.println(new Date());
             }
         }, 0, 40, TimeUnit.MILLISECONDS);
    }

4、Spring @Scheduled定时任务实现

案例:定期清理未激活用户,节省资源,方便用户再次注册。

Spring 3.0+ 自带的任务调度实现,主要依靠TaskScheduler接口的几个实现类实现。删除和修改任务比较麻烦。 
主要用法有以下三种: 

  • Spring配置文件实现

  • 注解实现

  • 代码动态添加

Spring定时任务比较简单,只需要在maven依赖中引入相关jar包,这里使用注解进行配置。

示例:

推荐阅读