Java定时任务

14 篇文章 1 订阅
12 篇文章 0 订阅

Timer和TimerTask

  • Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。
  • TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。

一个Timer调度的例子

/*
 * @author uv
 * @date 2018/10/23 15:17
 *
 */

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class JdkSchedule {

    private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void main(String[] args) {
        //创建任务
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                System.out.println(dateFormat.format(new Date()));
            }
        };
        new Timer().schedule(task, 1000, 5000);
        new Timer().schedule(task, new Date(), 5000);
        //如果到达下一个时间间隔时任务没有执行完,则任务执行完后立即执行下一个任务
        new Timer().scheduleAtFixedRate(task, 1000, 5000);
        new Timer().scheduleAtFixedRate(task, new Date(System.currentTimeMillis() - 1000 * 60), 5000);
    }
}

       delay:延迟执行时间 period:执行任务的时间间隔 

  • schedule(TimerTask task, long delay, long period) 

        firstTime:第一次执行的时间,如果时间在当前时间之前,会立即执行一次任务,然后再按照时间间隔执行任务                  period:时间间隔

  •  schedule(TimerTask task, Date firstTime, long period)

       delay:延迟执行时间 period:执行任务的时间间隔   

        firstTime:第一次执行的时间,如果时间在当前时间之前,计算firstTime到当前时间这一段时间内会执行多少次执行任务,然后无间隔地执行该次数的任务(补上之前应该执行的任务),然后再按照当前时间前最近的一次任务为时间起点,执行下一次任务(保证所有任务之间的时间间隔相同)                                                                                                  

  • cheduleAtFixedRate(TimerTask task, long delay, long period) 
  • cheduleAtFixedRate(TimerTask task, Date firstTime, long period)

 ScheduledExecutorService

  1. Timer不支持多线程。全部挂在Timer下的任务都是单线程的,任务仅仅能串行运行。假设当中一个任务运行时间过长。会影响到其它任务的运行,然后就可能会有各种接踵而来的问题。
  2. Timer的线程不捕获异常。TimerTask假设抛出异常,那么Timer唯一的进程就会挂掉,这样挂在Timer下的全部任务都会无法继续运行。
/*
 * @author uv
 * @date 2018/10/23 15:37
 *
 */

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

public class scheduledexecutor {

    private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //启用2个线程
        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
        //scheduleAtFixedRate前一个任务的开始时间与后一个任务的开始时间间隔保持相同
        executorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println(dateFormat.format(new Date()));
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, 1, 5, TimeUnit.SECONDS);
        //scheduleWithFixedDelay 前一个任务的结束时间与后一个任务的开始时间间隔保持相同
        //比如当前一个任务结束的时刻,开始结算间隔时间,如0秒开始执行第一次任务,任务耗时5秒,任务间隔时间3秒,那么第二次任务执行的时间是在第8秒开始。
        executorService.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                System.out.println(dateFormat.format(new Date()));
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, 1, 5, TimeUnit.SECONDS);

        ScheduledFuture<Integer> schedule = executorService.schedule(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                return 1 + 1;
            }
        }, 10, TimeUnit.SECONDS);
        System.out.println(schedule.get());
    }
}

Spring3.0以后自带的task

xml配置

 <!--开启任务-->
  <task:annotation-driven/>

任务类

@Component
public class Job {

    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Scheduled(cron = "0/5 * * * * ?")
    public void print() {
        System.out.println(dateFormat.format(new Date()));
    }
}
  • cron:指定cron表达式
  • zone:  指定cron表达式运行的时区
  • fixedDelay:表示从上一个任务完成开始到下一个任务开始的间隔,单位是毫秒。
  • fixedRate:从上一个任务开始到下一个任务开始的间隔,单位是毫秒。
  • initialDelay:  任务第一次被调用前的延时,单位毫秒

cron表达式生成器:http://cron.qqe2.com/ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。 Quartz的优势: 1、Quartz是一个任务调度框架(库),它几乎可以集成到任何应用系统中。 2、Quartz是非常灵活的,它让您能够以最“自然”的方式来编写您的项目的代码,实现您所期望的行为 3、Quartz是非常轻量级的,只需要非常少的配置 —— 它实际上可以被跳出框架来使用,如果你的需求是一些相对基本的简单的需求的话。 4、Quartz具有容错机制,并且可以在重启服务的时候持久化(”记忆”)你的定时任务,你的任务也不会丢失。 5、可以通过Quartz,封装成自己的分布式任务调度,实现强大的功能,成为自己的产品。6、有很多的互联网公司也都在使用Quartz。比如美团 Spring是一个很优秀的框架,它无缝的集成了Quartz,简单方便的让企业级应用更好的使用Quartz进行任务的调度。   课程说明:在我们的日常开发中,各种大型系统的开发少不了任务调度,简单的单机任务调度已经满足不了我们的系统需求,复杂的任务会让程序猿头疼, 所以急需一套专门的框架帮助我们去管理定时任务,并且可以在多台机器去执行我们的任务,还要可以管理我们的分布式定时任务。本课程从Quartz框架讲起,由浅到深,从使用到结构分析,再到源码分析,深入解析Quartz、Spring+Quartz,并且会讲解相关原理, 让大家充分的理解这个框架和框架的设计思想。由于互联网的复杂性,为了满足我们特定的需求,需要对Spring+Quartz进行二次开发,整个二次开发过程都会进行讲解。Spring被用在了越来越多的项目中, Quartz也被公认为是比较好用的定时器设置工具,学完这个课程后,不仅仅可以熟练掌握分布式定时任务,还可以深入理解大型框架的设计思想。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值