Python 官方文档:入门教程 => 点击学习
目录前言定时任务框架TimeTaskScheduledExecutorServicespring Task结语前言 开发的系统中过程,会有如下的需求: 凌晨生成订单统计报表定时推送文
开发的系统中过程,会有如下的需求:
通常这些需求我们都是通过定时任务来实现,列举了java中一些常用的的定时任务框架。
从我们开始学习java开始,最先实现定时任务的时候都是采用TimeTask, Timer内部使用TaskQueue的类存放定时任务,它是一个基于最小堆实现的优先级队列。TaskQueue会按照任务距离下一次执行时间的大小将任务排序,保证在堆顶的任务最先执行。
实例代码:
public static void main(String[] args)
{
TimerTask task = new TimerTask() {
public void run() {
System.out.println("当前时间: " + new Date() + "n" +
"线程名称: " + Thread.currentThread().getName());
}
};
Timer timer = new Timer("Timer");
long delay = 5000L;
timer.schedule(task, delay);
System.out.println("当前时间: " + new Date() + "n" +
"线程名称: " + Thread.currentThread().getName());
}
运行结果:
当前时间: Wed Apr 06 22:05:04 CST 2022n线程名称: main
当前时间: Wed Apr 06 22:05:09 CST 2022n线程名称: Timer
复制代码
从结果可以看出,5秒后执行了定时任务。
缺点:
随着时间的推移,java的技术也在不断的更新,针对TimeTask的不足,ScheduledExecutorService出现替代了TimeTask。
ScheduledExecutorService是一个接口,有多个实现类,比较常用的是ScheduledThreadPoolExecutor。而ScheduledThreadPoolExecutor本身就是一个线程池,其内部使用 DelayQueue 作为任务队列,并且支持任务并发执行。
实例代码:
public static void main(String[] args) throws InterruptedException
{
ScheduledExecutorService executorService =
Executors.newScheduledThreadPool(3);
// 执行任务: 每 10秒执行一次
executorService.scheduleAtFixedRate(() -> {
System.out.println("执行任务:" + new Date()+",线程名称: " + Thread.currentThread().getName());
}, 1, 10, TimeUnit.SECONDS);
}
缺点:
学习了Spring之后,开始使用了Spring 自带的Task。Spring Framework 自带定时任务,提供了 cron 表达式来实现丰富定时任务配置。
实例代码:
@EnableScheduling
@Component
public class SpringTask
{
private Logger logger = LoggerFactory.getLogger(SpringTask.class);
private static final SimpleDateFORMat dateFormat = new SimpleDateFormat(
"HH:mm:ss");
@Scheduled(fixedRate = 5000)
public void invokeTaskWithFixedRate()
{
logger.info("Fixed Rate Task : Current Time is {}",
dateFormat.format(new Date()));
}
@Scheduled(fixedDelay = 2000)
public void invokeTaskWithFixedDelay()
{
try
{
TimeUnit.SECONDS.sleep(3);
logger.info("Fixed Delay Task : Current Time is {}",
dateFormat.format(new Date()));
}
catch (InterruptedException e)
{
logger.error("invoke task error",e);
}
}
@Scheduled(initialDelay = 5000, fixedRate = 5000)
public void invokeTaskWithInitialDelay()
{
logger.info("Task with Initial Delay : Current Time is {}",
dateFormat.format(new Date()));
}
@Scheduled(cron = "0/5 * * * * ? ")
public void invokeTaskWithCronExpression()
{
logger.info("Task Cron Expression: Current Time is {}",
dateFormat.format(new Date()));
}
}
执行结果:
2022-04-06 23:06:20.945 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask : Task Cron Expression: Current Time is 23:06:20
2022-04-06 23:06:22.557 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask : Task with Initial Delay : Current Time is 23:06:22
2022-04-06 23:06:22.557 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask : Fixed Rate Task : Current Time is 23:06:22
2022-04-06 23:06:25.955 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask : Fixed Delay Task : Current Time is 23:06:25
2022-04-06 23:06:25.955 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask : Task Cron Expression: Current Time is 23:06:25
2022-04-06 23:06:27.555 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask : Task with Initial Delay : Current Time is 23:06:27
2022-04-06 23:06:27.556 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask : Fixed Rate Task : Current Time is 23:06:27
@EnableScheduling需要开启定时任务,@Scheduled(cron = "0/5 * * * * ?")配置定时任务的规则。cron表达式支持丰富定时任务配置,不熟悉的的可以查看
优点:
使用简单方便,支持各种复杂的定时任务配置
缺点:
任何技术的出现都有它的价值,技术没有最好的,只有最合适的。我们要针对不同的需求选择最合适的技术,切莫过度架构设计。本文讲解了单机环境实现定时任务的技术,
到此这篇关于Java单机环境实现定时任务技术的文章就介绍到这了,更多相关Java定时任务框架内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: Java单机环境实现定时任务技术
本文链接: https://lsjlt.com/news/146717.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0