这个工具类可用于随时添加或更改或移除定时任务
import com.sun.jersey.client.impl.CopyOnWriteHashMap;
import javax.validation.constraints.NotNull;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
/**
* 周期任务工具类
* @Auther Jun jie Yi
* @Date 13:12 2021/11/7
*/
public class RateTaskUtil {
//定义定时任务的线程池
private ScheduledExecutorService pool;
//存储正在执行的定时任务
private Map<String, ScheduledFuture> allTask;
public static RateTaskUtil getInstance() {
//默认线程池中20条线程
return new RateTaskUtil(20);
}
/**
* 自定义线程数
* @param corePoolSize 核心线程数
* @return
*/
public static RateTaskUtil getInstance(@NotNull int corePoolSize) {
return new RateTaskUtil(corePoolSize);
}
/**
* @param corePoolSize 核心线程数
* @return
*/
private RateTaskUtil(@NotNull int corePoolSize) {
//创建核心线程池
pool = Executors.newScheduledThreadPool(corePoolSize);
//创建正在执行的任务存储集合
allTask = new CopyOnWriteHashMap<>();
}
/**
* 获取任务队列
* @return
*/
public Map<String, ScheduledFuture> getTaskQueue() {
return allTask;
}
/**
* 关闭线程池并情况任务队列
*/
public void shutDownPool() {
if (pool != null) {
pool.shutdown();
allTask.clear();
}
}
/**
* 添加一个周期任务
*
* @param key 任务键值
* @param task 任务内容
* @param initialDelay 延迟执行时间
* @param period 执行周期
* @param unit 时间单位
* @return
*/
public boolean addTask(@NotNull String key, @NotNull Runnable task, @NotNull long initialDelay,@NotNull long period,@NotNull TimeUnit unit) {
//添加之前要保证存在这个运行任务不存在
if(isHaveTask(key)) {
System.out.println(key + " 键值对应的任务已经存在,添加失败。");
return false;
}
//开启一个任务
ScheduledFuture<?> scheduledFuture = pool.scheduleAtFixedRate(task, initialDelay, period, unit);
//添加到列表之中
allTask.put(key, scheduledFuture);
return true;
}
/**
* 删除一个任务
*
* @param key 运行任务键值
* @return
*/
public boolean deleteTask(@NotNull String key) {
//删除之前要保证存在这个运行任务
if(!isHaveTask(key)) {
System.out.println(key + " 键值对应的任务不存在,删除失败。");
return false;
}
ScheduledFuture<?> scheduledFuture = allTask.get(key);
//停止改任务
scheduledFuture.cancel(false);
//从列表之中移除
allTask.remove(key);
return true;
}
/**
* 修改一个任务
*
* @param key 运行任务键值
* @param task 任务内容
* @param initialDelay 延迟执行时间
* @param period 执行周期
* @param unit 时间单位
* @return
*/
public boolean updateTask(@NotNull String key, @NotNull Runnable task, @NotNull long initialDelay, @NotNull long period, @NotNull TimeUnit unit) {
//修改之前要保证存在这个运行任务
if(!isHaveTask(key)) {
System.out.println(key + " 键值对应的任务不存在,修改失败。");
return false;
}
ScheduledFuture<?> scheduledFuture = allTask.get(key);
//停止改任务
scheduledFuture.cancel(false);
//根据新规则重新添加改任务
ScheduledFuture<?> newScheduledFuture = pool.scheduleAtFixedRate(task, initialDelay, period, unit);
//重新添加
allTask.put(key, newScheduledFuture);
return true;
}
/**
* 判断此任务是否存在
* @param key
* @return
*/
public boolean isHaveTask(@NotNull String key) {
return allTask.containsKey(key);
}
}