java使用ScheduledFuture实现定时推送
1、封装方法
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @author Administrator
*/
public class TimerUtils {
private static Map<String, ScheduledFuture<?>> tasks = new HashMap<>();
public static void timerOnce(String key,Date scheduledTime,Runnable runnable) {
System.out.println("调用定时模块");
long now = System.currentTimeMillis();
//获取设定时间
long time = scheduledTime.getTime();
// 减去当前时间 获取需要间隔多少毫秒执行
long initialDelay = time - now;
//距离目标点还有多少毫秒
System.err.println("initialDelay:"+initialDelay);
ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1,new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());
ScheduledFuture<?> schedule = executorService.schedule(runnable, initialDelay, TimeUnit.MILLISECONDS);
tasks.put(key,schedule);
}
/**
* 改签
* @param meetingId
* @param scheduledTime
*/
public static void rescheduleTask(String meetingId, Date scheduledTime,Runnable runnable) {
ScheduledFuture<?> task = tasks.get(meetingId);
if (task != null) {
task.cancel(false);
}
timerOnce(meetingId, scheduledTime,runnable);
}
/**
* 取消
* @param key
*/
public static void cancelTask(String key) {
ScheduledFuture<?> task = tasks.get(key);
if (task != null) {
task.cancel(false);
tasks.remove(key);
}
}
}
2、调用方法
Runnable runnable = new Runnable() {
public void run() {
//具体业务
......
//实现完取消任务
TimerUtils.cancelTask("xxx_id");
}
};
TimerUtils.timerOnce("xxx_id",时间,runnable);