zoukankan      html  css  js  c++  java
  • 定时任务调度框架实现总结

    转自:http://www.blogchong.com/post/96.html

    在应用里经常都有用到在后台跑定时任务的需求。

    举个例子,比如需要在服务后台跑一个定时任务来进行非实时计算,清除临时数据、文件等;又比如博客资讯网站需要定时更新最新最热资讯列表等;又比如后台需要定时获取数据等。

    其实,不止这些场景,定时任务始终会在业务处理中占据很重要的位置,因此,熟悉定时任务框架的使用非常有必要。

    通常有四种实现定时任务的方式:

    (1)直接使用线程Thread来达到定时的目的

    我们创建一个thread,然后让他一直while循环,并且使用sleep的方式达到定时的目的。

    这种方法简单,但是略显粗暴,并且功能上也有所欠缺,难以控制定时任务启停。

    简单例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    package com.blogchong.util;
     
    /**
     * @author:blogchong
     * @E-mail: blogchong@163.com
     * @Version:1.0
     * @Blog: www.blogchong.com
     * @CreateTime:2015年4月1日 上午11:09:29
     * @Description: Thread实现定时任务
     */
     
    public class Timing {
     
        public static void main(String[] args) {
     
            //设置时间间隔
            final long timeInterval = 1000;
             
            Runnable runnable = new Runnable() {
                 
                public void run() {
                    while (true) {
     
                        //执行定时
                        System.out.println("Hello,blogchong~!欢迎继续关注博客虫!");
     
                        try {
     
                            //进入定时
                            Thread.sleep(timeInterval);
     
                        catch (InterruptedException e) {
     
                            e.printStackTrace();
     
                        }
                    }
                }
            };
             
            Thread thread = new Thread(runnable);
            thread.start();
        }
     
    }

    (2)使用Timer和TimerTask

    使用Timer类,可以调度任务,并且可以控制取消任务,第一次执行时,可以设置延迟执行时间,并且Timer类是线程安全的。

    使用实例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    package com.blogchong.util;
     
    /**
     * @author:blogchong
     * @E-mail: blogchong@163.com
     * @Version:1.0
     * @Blog: www.blogchong.com
     * @CreateTime:2015年4月1日 上午11:09:29
     * @Description: Thread实现定时任务
     */
     
    import java.util.Timer;
    import java.util.TimerTask;
     
    public class Timing {
     
        public static void main(String[] args) {
             
              TimerTask task = new TimerTask() {
                   
                  public void run() {
                      System.out.println("欢迎关注博客虫公众微信号blogchong!");
                  }
                };
                 
                Timer timer = new Timer();
                long delay = 0;
                long intevalPeriod = 1 1000;
     
                timer.scheduleAtFixedRate(task, delay, intevalPeriod);
               
        
    }

    (3)使用ScheduledExecutorService

    在Timer的基础上,ScheduledExecutorService是通过线程池来执行的,同样支持延迟执行,提供良好的入口设置时间间隔。

    代码实例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    package com.blogchong.util;
     
    /**
     * @author:blogchong
     * @E-mail: blogchong@163.com
     * @Version:1.0
     * @Blog: www.blogchong.com
     * @CreateTime:2015年4月1日 上午11:09:29
     * @Description: Thread实现定时任务
     */
     
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
     
    public class Timing {
     
        public static void main(String[] args) {
     
            Runnable runnable = new Runnable() {
     
                //run里头的是执行主体
                public void run() {
                    System.out.println("博客虫讲解的storm视频,马上会在极客学院上线,欢迎关注!");
                }
                 
            };
     
            ScheduledExecutorService service = Executors
                    .newSingleThreadScheduledExecutor();
            // 设置时间间隔,如示例,0为延迟时间,1为间隔,最后一个为时间单位
            service.scheduleAtFixedRate(runnable, 01, TimeUnit.SECONDS);
     
        }
    }

    (4)使用quartz框架

    quartz是一个定时任务调度框架,或者说是作业调度框架。想比与之前三种定时任务的实现,更为复杂。他不止能支持成千上百个作业任务的调度,同时它还能对所有的定时任务进行操作,比如启动,停止,暂停,查看等。

    此外,quartz还支持集群的部署方式,支持多节点,通过mysql进行中间状态的保存,支持在单节点故障的情况下依然能够保证任务的正常调度。

  • 相关阅读:
    Mysql 单表查询-排序-分页-group by初识
    Mysql 单表查询where初识
    Mysql 库表操作初识
    Mysql 常见数据类型及约束
    数据库 初识
    Mysql 游标初识
    Mysql 控制结构初识
    Mysql 存储过程初识
    单链表-Python实现-jupyter->markdown 格式测试
    MySQL 触发器学习-markdown->html 格式测试
  • 原文地址:https://www.cnblogs.com/sharpest/p/8571887.html
Copyright © 2011-2022 走看看