A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 西安Java组 于 2018-2-1 13:01 编辑

第一种实现方式 : Timer
Timer类是由JDK提供的,可以用来执行简单的定时任务;
1).延迟执行任务, 任务只执行一次
[Java] 纯文本查看 复制代码
public static void main(String[] args){
                
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
                @Override
                public void run() {
                        System.out.println(new Date() + " : It is time to send mail to leader ... ");
                }
        }, 2000);
                
}

2).延迟一定时间执行任务, 任务周期性执行
[Java] 纯文本查看 复制代码
public static void main(String[] args){
        
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
                @Override
                public void run() {
                        System.out.println(new Date() + " : It is time to send mail to leader ... ");
                }
        }, 2000, 1000);
        
}

3).任务到达时间后执行 , 仅执行一次

[Java] 纯文本查看 复制代码
public static void main(String[] args) {
        
        System.out.println(new Date() +" : 程序开始执行  ...");
        Timer timer = new Timer();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.SECOND, 30);
        
        timer.schedule(new TimerTask() {
                @Override
                public void run() {
                        System.out.println(new Date() + " : It is time to send mail to leader ... ");
                }
        }, calendar.getTime());

}

4).任务到达时间后执行 , 之后每隔一段时间执行

[Java] 纯文本查看 复制代码
public static void main(String[] args) {
        
        System.out.println(new Date() +" : 程序开始执行  ...");
        Timer timer = new Timer();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.SECOND, 10);
        
        timer.schedule(new TimerTask() {
                @Override
                public void run() {
                        System.out.println(new Date() + " : It is time to send mail to leader ... ");
                }
        }, calendar.getTime(),3000);

}

上述JDK提供的定时器只能够执行一些简单的定时任务 , 一些稍微复杂些的定时实现起来比较麻烦 ; 比如 , 需要实现上午09:00下午 18:00 执行定时任务发送邮件 ;

第二种实现方式 : Spring对定时任务的支持scheduled-tasks

1).引入依赖
只需要引入核心依赖就可以了
[Java] 纯文本查看 复制代码
<dependencies>
         <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-beans</artifactId>
                 <version>4.2.4.RELEASE</version>
         </dependency>
         <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-context</artifactId>
                 <version>4.2.4.RELEASE</version>
         </dependency>
         <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-core</artifactId>
                 <version>4.2.4.RELEASE</version>
         </dependency>
         <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-expression</artifactId>
                 <version>4.2.4.RELEASE</version>
         </dependency>
 </dependencies>

2).定义任务类
就是一个简单的java类 , 其中定义任务方法sendMail()
[Java] 纯文本查看 复制代码
public class MyTask1 {
        
        public void sendMail(){
                System.out.println(new Date() + " : It is time to send mail to leader ...");
        }
        
}
3).配置任务bean
将定义好的任务类, 交给spring容器管理
[XML] 纯文本查看 复制代码
<bean id="task1" class="timerdemo.MyTask1"></bean>

4). 配置任务
   A. 延迟一段时间执行第一次任务,之后每隔固定时间(是从上一次任务执行完成时间开始计算)执行
[XML] 纯文本查看 复制代码
<task:scheduled-tasks>
        <task:scheduled ref="task1" method="sendMail" initial-delay="2000" fixed-delay="5000"/>
</task:scheduled-tasks>

   ref : 指任务类的bean的id
    method : 任务类中的具体执行任务的方法名
    initial-delay: 第一次执行任务的时候延迟时间 , 需要配置fixed-rate 或 fixed-delay使用
    fixed-delay: 执行的时间周期 (是从上一次任务执行完成时间开始计算)

    B. 延迟一段时间执行第一次任务, 之后每隔固定时间(是从上一次任务执行开始时间开始计算)执行
[XML] 纯文本查看 复制代码
<task:scheduled-tasks>
        <task:scheduled ref="task1" method="sendMail" initial-delay="2000" fixed-rate="5000"/>
</task:scheduled-tasks>

   ref : 指任务类的bean的id
    method : 任务类中的具体执行任务的方法名
    initial-delay: 第一次执行任务的时候延迟时间 , 需要配置fixed-rate 或 fixed-delay使用
    fixed-rate: 执行的时间周期 (是从上一次任务执行开始时间开始计算)

   C. 按照执行的cron表达式指定的时间执行任务
[XML] 纯文本查看 复制代码
        <task:scheduled-tasks>
                <task:scheduled ref="task1" method="sendMail" cron="0 0 9,18 * * *"/>
        </task:scheduled-tasks>
    上述表达式含义 : 每天上午09:00:00 下午的 18:00:00 执行任务

cron表达式介绍 :
一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素
按顺序依次为 :
         ------------0~59
        分钟 ----------0~59
        小时 ----------0~23
         ------------0~31,但是你需要考虑你月的天数)
         ------------0~11
        (星期) -----1~7 1=SUN SUNMONTUEWEDTHUFRISAT
        年份 ---------19702099
其中每个元素可以是一个值(6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。
Cron表达式的样例 :
    0 0 10,14,16 * * ?              每天上午10点,下午2点,4
    0 0/30 9-17 * * ?           朝九晚五工作时间内每半小时
    0 0 12 ? * WED                  表示每个星期三中午12
    0 0 12 * * ?                    每天中午12点触发
    0 15 10 ? * *                   每天上午10:15触发
    0 15 10 * * ?                   每天上午10:15触发
    0 15 10 * * ? *                 每天上午10:15触发
    0 15 10 * * ? 2005              2005年的每天上午10:15触发
    0 * 14 * * ?                    在每天下午2点到下午2:59期间的每1分钟触发
    0 0/5 14 * * ?                  在每天下午2点到下午2:55期间的每5分钟触发
    0 0/5 14,18 * * ?               每天14点到2:55期间和18点到6:55期间每5分触发
    0 0-5 14 * * ?                  在每天下午2点到下午2:05期间的每1分钟触发
    0 10,44 14 ? 3 WED              每年三月的星期三的下午2:102:44触发
    0 15 10 ? * MON-FRI             周一至周五的上午10:15触发
    0 15 10 15 * ?                  每月15日上午10:15触发
    0 15 10 L * ?                   每月最后一日的上午10:15触发
    0 15 10 ? * 6L                  每月的最后一个星期五上午10:15触发
    0 15 10 ? * 6L 2002-2005        2002年至2005年每月最后一个星期五10:15触发
    0 15 10 ? * 6#3                 每月的第三个星期五上午10:15触发

5 个回复

倒序浏览
不错, 不错 ...........
回复 使用道具 举报
不错, 不错 ...........
回复 使用道具 举报
棒棒哒 ..............
回复 使用道具 举报
棒棒哒 ..............
回复 使用道具 举报
棒棒哒 ..............
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马