定时任务 需要借助锁,尤其是异步定时任务。
如果没有锁,假如当前任务没有执行完毕,然后到时间又继续执行,就会导致资源被为无限消耗。
实现思路就是:
执行任务前尝试获取锁,得到锁后执行后面的业务,然后执行完毕释放锁
尝试获取锁失败,就不执行业务代码
说明
源代码
import com.hean.iot.platform.threadPool.ThreadPoolUtil;
import com.hean.iot.platform.utils.CountRunTimeCostUtil;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import java.util.concurrent.locks.ReentrantLock;
/**
* 检测心跳定时任务
*
* @Author XZ.Tan
* @Date: 2021/2/26 14:48
* @Version 1.0
*/
@Component
public class HeartbeatSchedule {//引入锁
private static ReentrantLock reentrantLock = new ReentrantLock();@Async
//固定速率,单位是毫秒。表示一个任务开始后间隔多长时间才执行下一个执行
@Scheduled(initialDelayString = "${threadPool.heartbeatDelay}", fixedRateString = "${threadPool.heartbeatfixedRate}")
public void calculate1() {
if (reentrantLock.tryLock()) {
System.out.println("定时任务1执行开始!");
try {
// 这里是加入统计执行时间工具---业务代码开始
try (CountRunTimeCostUtil c = new CountRunTimeCostUtil("执行程序")) {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 统计执行时间工具---业务代码结束
System.out.println("定时任务1执行成功!");
} catch (Exception e) {} finally {
// 释放锁
reentrantLock.unlock();
}}
}
}
ThreadPoolUtil CountRunTimeCostUtil 主要是统计执行代码的执行时间,需要的话 请移步
打印代码块执行时间方案,优雅打印执行耗时日志_cy谭的博客-CSDN博客_打印日志耗时
如果不用的话,第一层try catch 里面直接写业务代码