JDK 自带任务调度
2020-02-06 / 大向

JDK 自带任务调度

有如下好处:

1.当启动和取消任务时可以控制
2.第一次执行任务时可以指定你想要的delay时间

在实现时,Timer类可以调度任务,TimerTask则是通过在run()方法里实现具体任务。
Timer实例可以调度多任务,它是线程安全的。
当Timer的构造器被调用时,它创建了一个线程,这个线程可以用来调度任务。

代码实现:

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

//用DATE类实现
public class TimedTask1 {

// 获取应该在多少秒后
public static long getTaskTime(int shi,int fen) {
    DateFormat sdf = new SimpleDateFormat("HH:mm:ss");

    // 当前时分秒字符串切成数组
    String[] sArr = sdf.format(new Date()).split(":");
    // 从数组取值换算成 秒计数值
    long currentMiao = (Integer.parseInt(sArr[0]) *60*60) + (Integer.parseInt(sArr[1]) *60)
            + Integer.parseInt(sArr[2]);
        // 设定的执行时间换算成 秒计数值
        long runTime = (shi*60*60 + fen*60);

        if (currentMiao <= runTime) {
            return runTime - currentMiao;
        } else {
            return currentMiao + (24*60*60) - (currentMiao - runTime);
        }
    }

    // 定时任务
    public static void cronJob(int shi,int fen) {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            // 把run方法里的内容换成要运行的代码
            public void run() {

                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                System.out.println("当前的系统时间为:" + sdf.format(new Date()));

            }
        }, getTaskTime(shi,fen) *1000, 24*60*60*1000);
    }

    /*public static void main(String[] args) {
        cronJob(18,30);
    }*/
}

// 用Calendar实现
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class TimedTask2 {
    public static void cronJob(int shi, int fen, int miao) {
        Calendar cal = Calendar.getInstance();
        // 每天定点执行
        cal.set(Calendar.HOUR_OF_DAY, shi);
        cal.set(Calendar.MINUTE, fen);
        cal.set(Calendar.SECOND, miao);

        Timer timer = new Timer();
        timer.schedule(new TimerTask() {

            public void run() {
                // 把run方法里的内容换成你要执行的内容
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                System.out.println("当前的系统时间为:" + sdf.format(new Date()));
            }
        }, cal.getTime(), 24 * 60 * 60 * 1000);
    }

    /*
     * public static void main(String[] args) { 
     * cronJob(18, 30, 0); //24小时制 时分秒 
     * }
     */
}

java定时任务接口ScheduledExecutorService

ScheduledExecutorService是从Java SE 5的java.util.concurrent里,做为并发工具类被引进的,这是最理想的定时任务实现方式。

ScheduledExecutorService,是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。

需要注意,只有当调度任务来的时候,ScheduledExecutorService才会真正启动一个线程,其余时间ScheduledExecutorService都是出于轮询任务的状态。

好处:

1.相比于Timer的单线程,它是通过线程池的方式来执行任务的2.可以很灵活的去设定第一次执行任务delay时间3.提供了良好的约定,以便设定执行的时间间隔。

代码实现:

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

public class TimedTask {
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            public void run() {
                // 把run方法里的内容换成你要执行的内容
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                System.out.println("当前的系统时间为:" + sdf.format(new Date()));
            }
        };
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        //public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);
        //command--执行的任务,initialDelay--延迟开始,period--间隔时间,unit--时间单位
        service.scheduleAtFixedRate(runnable, 0, 5, TimeUnit.SECONDS);
    }
}
xxx
本文链接:https://chenylwork.gitee.io/2020/02/06/JDK%20%E8%87%AA%E5%B8%A6%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6/