问题描述:业务中需要执行 给定时间的结算任务(在给定的时间只执行一次),每次执行结算任务的时间没有规律而言。
还是采用ScheduledExecutorService的方式执行定时任务,之前的文章有详细讲解ScheduledExecutorService的构造原理。
下面直接贴上代码,供学习讨论。
ScheduledExecutorService scheduledExecutorService= new ScheduledThreadPoolExecutor(1,
new BasicThreadFactory.
Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());
/**
*
* @param settlementTimes 需要执行任务的时间集合
*/
public void scheduledWorkTask(Set<Long> settlementTimes){
long nowTime = System.currentTimeMillis();
Long minSettlementTime = minSettlementTime(nowTime, settlementTimes);
if (minSettlementTime != null){
// schedule 在延迟多少毫秒后 只执行一次
scheduledExecutorService.schedule(new Runnable() {
@Override
public void run() {
// 这里使用try catch 保证定时任务不中断
try {
// 自己的代码逻辑
// 执行此次定时任务 再定时还未执行的时间任务 递归的方式
scheduledWorkTask(settlementTimes);
}catch (Exception e){
log.error(e.getMessage(),e);
}
}
},minSettlementTime-nowTime,TimeUnit.MILLISECONDS);
}
}
/**
*
* @param nowTime 当前时间
* @param settlementTimes 需要执行任务的时间集合
* @return 求出比当前时间大的最小时间
*/
public Long minSettlementTime(long nowTime, Set<Long> settlementTimes){
if (settlementTimes.isEmpty()){
return null;
}
Long min = Collections.min(settlementTimes);
if (nowTime > min){
settlementTimes.remove(min);
return minSettlementTime(nowTime,settlementTimes);
}else {
return min;
}
}
希望我的代码,能帮你带来些思路!
您的点赞,是我更新的动力!
还请各位大佬,提出批评指正!