使用java自带的ScheduledThreadPoolExecutor线程池实现定时任务功能
     2019-04-10 16:51:54   深圳市 阅读数 49 点赞 收藏 举报 编辑

自JDK1.5开始,JDK提供了 ScheduledThreadPoolExecutor 类来支持周期性任务的调度,因为是jdk自带的功能,所以不需要任何第三方的工具,直接将以下代码复制过去就可以直接使用,这是实现了2个定时任务功能,都是周期性调度的功能,间隔执行和每天执行,如果需要每月执行只需更改 period 参数的值即可实现


package com.scheduled;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
* <定时任务>
*
* @className ScheduledTask
* @Author xd
* @Date 2019/4/10 16:25
**/
public class ScheduledTask {

//创建大小为6的线程池
private static ScheduledExecutorService schedule = new ScheduledThreadPoolExecutor(6);

/**
* 获取指定时间对应的毫秒数
*
* @param time "HH:mm:ss"
* @return
*/
private static long getTimeMillis(String time) {
try {
DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
DateFormat dayFormat = new SimpleDateFormat("yy-MM-dd");
Date curDate = dateFormat.parse(dayFormat.format(new Date()) + " " + time);
return curDate.getTime();
} catch (ParseException e) {
e.printStackTrace();
}
return 0;

}

/**
*
* <连续间隔执行>
*
* @param
* @return void
* @author yexd 2019/4/10 16:44
*/
public void whileRun() {

//初始化延时-第一次执行时延时执行定时任务
int initialDelay = 100;
//两次开始执行最小间隔时间 就是多长时间执行一次
int period = 1000;
//定时任务-每1秒执行一次
final ScheduledFuture<?> beeperHandle = schedule.scheduleAtFixedRate(new Runnable() {
public void run() {
System.out.println("beep");
}
}, initialDelay, period, TimeUnit.MILLISECONDS);

}


/***
*
* <每天执行>
*
* @param
* @return void
* @author yexd 2019/4/10 16:43
*/
public void everyDayRun(){
//每天执行的时间
String date = "16:43:00";
long oneDay = 24 * 60 * 60 * 1000;
long initDelay = getTimeMillis(date) - System.currentTimeMillis();
initDelay = initDelay > 0 ? initDelay : oneDay + initDelay;
//定时任务-每天的指定时间执行一次
schedule.scheduleAtFixedRate(new Runnable() {
public void run() {
System.out.println("cancel");
}
}, initDelay,oneDay, TimeUnit.MILLISECONDS);
}
/**
*
* <main方法>
*
* @param args
* @return void
* @author yexd 2019/4/10 16:45
*/
public static void main(String[] args) {
ScheduledTask scheduledTask = new ScheduledTask();
// scheduledTask.whileRun();
scheduledTask.everyDayRun();
}
}
发表评论