欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java定时任务,

来源: javaer 分享于  点击 33732 次 点评:15

Java定时任务,


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

/*
 * @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/ 

相关文章

    暂无相关文章
相关栏目:

用户点评