Java | 一分钟掌握定时任务 | 4 - 多线程的Timer

news2025/1/19 20:42:06

作者:Mars酱

声明:本文章由Mars酱原创,部分内容来源于网络,如有疑问请联系本人。

转载:欢迎转载,转载前先请联系我!

前言

JDK自带的Timer是无法做到多任务并发的,那么我们怎么处理多任务定时的并发问题呢?这章节Mars酱来研究下。

Mars酱能想到的就是多线程、线程池这些关键字。

ScheduledExecutorService

ScheduledExecutorService是一个继承ExecutorService的接口类,ExecutorServiceMars酱记得在 Java | 一分钟掌握异步编程 | 3 - 线程异步 - 掘金 (juejin.cn) 提到过,使用多线程实现异步的时候,创建线程池就是用的Executors创建的,这里创建一个任务类型的线程池,我们可以使用:

// mars酱
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool();

改写前面的例子

我们在前面使用Timer的时候遇到了阻塞,这次我们改用任务线程池来做,改一下前一篇的例子:

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

/**
 * @author mars酱
 */
public class MarsTimer {
    public static void main(String[] args) {
//        java.util.Timer timer = new Timer();
//        timer.schedule(new TimerTask() {
//            @Override
//            public void run() {
//                System.out.println("当前时间:" + new Date());
//            }
//        }, 1000, 5000);

        // 1. 创建第一个任务,打印时间后延迟5秒
        TimerTask tta = new TimerTask() {
            @SneakyThrows
            @Override
            public void run() {
                System.out.println(">> 这是a任务:当前时间:" + new Date());
                Thread.sleep(5000);
            }
        };

        // 2. 创建第二个任务,直接打印毫秒数
        TimerTask ttb = new TimerTask() {
            @Override
            public void run() {
                System.out.println("<< 这是b任务:当前毫秒:" + System.currentTimeMillis());
            }
        };

//        Timer timera = new Timer();
//        // 3. 把两个任务都加入计时器中
//        timera.schedule(tta, 1000, 5000);
//        timera.schedule(ttb, 1000, 5000);
        // 3. 创建一个核心线程为5的池
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
        // 4. 塞入第一个任务,5秒的一遍
        scheduledExecutorService.scheduleAtFixedRate(tta, 1000, 5000, TimeUnit.MILLISECONDS);
        // 5. 塞入第二个任务,也是5秒一遍
        scheduledExecutorService.scheduleAtFixedRate(ttb, 1000, 5000, TimeUnit.MILLISECONDS);
    }
}

改写之后,运行一下,得到的结果为:

好了,很工整,a和b两个任务都是独立在运行了,完美解决掉了共享队列导致阻塞的问题。

问题来了

如果Mars酱的任务是每个月执行一次,或者生日任务是每年执行一次,怎么办呐?

ScheduledExecutorService中的schedule函数虽然是支持周期单位到天的,但是如果是每周、每月、每年这种任务,我们在下次任务执行的时候,还要自行计算好时间才行,还是有点缺陷,解决办法也有:支持cron表达式就行。但是ScheduledExecutorService提供的方法是不支持cron表达式的。下面是cron表达是的介绍

cron表达式

cron表达式是一个具有时间含义的字符串,字符串以56个空格隔开,分为67个域,格式为X X X X X X X。其中X是一个域的占位符。最后一个代表年份的域非必须,可省略。单个域有多个取值时,使用半角逗号 , 隔开取值。每个域可以是确定的取值,也可以是具有逻辑意义的特殊字符。每个域最多支持一个前导零。比如:

0 10 01 ? * * 2023

表示2023年每天凌晨1点10分执行任务

域占位符的取值

下表为cron表达式中支持的特殊字符,以及含义:

特殊字符含义示例
*****所有可能的值。在月域中, ***** 表示每个月;在星期域中, ***** 表示星期的每一天。
,列出枚举值。在分钟域中,5,20表示分别在5分钟和20分钟触发一次。
-范围。在分钟域中,5-20表示从5分钟到20分钟之间每隔一分钟触发一次。
/指定数值的增量。在分钟域中,0/15表示从第0分钟开始,每15分钟。在分钟域中3/20表示从第3分钟开始,每20分钟。
?不指定值,仅日期和星期域支持该字符。当日期或星期域其中之一被指定了值以后,为了避免冲突,需要将另一个域的值设为 ?
L单词Last的首字母,表示最后一天,仅日期和星期域支持该字符。说明 指定L字符时,避免指定列表或者范围,否则,会导致逻辑问题。- 在日期域中,L表示某个月的最后一天。在星期域中,L表示一个星期的最后一天,也就是星期日(SUN)。
  • 如果在L前有具体的内容,例如,在星期域中的6L表示这个月的最后一个星期六。 |
    | W | 除周末以外的有效工作日,在离指定日期的最近的有效工作日触发事件。W字符寻找最近有效工作日时不会跨过当前月份,连用字符LW时表示为指定月份的最后一个工作日。 | 在日期域中5W,如果5日是星期六,则将在最近的工作日星期五,即4日触发。如果5日是星期天,则将在最近的工作日星期一,即6日触发;如果5日在星期一到星期五中的一天,则就在5日触发。 |
    | # | 确定每个月第几个星期几,仅星期域支持该字符。 | 在星期域中,4#2表示某月的第二个星期四。

哪些定时任务支持cron表达式?

Linux操作系统支持cron表达式,Java支持cron表达式的有Spring框架。

到站下车了,下站见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/532356.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何编写一份优质软件测试工程师简历的范文【建议收臧】

很多刚转行软件测试的小伙伴是不是不知道怎么写好一份优质的软件测试工程师的简历。今天呢&#xff0c;就给大家分享一下一个优质软件测试工程师简历的范文。记得收藏起来哦。 下面的案例&#xff1a;2-3年的软件测试工程的简历 姓 名&#xff1a;XXX 学历&#xff1a…

Zabbix“专家坐诊”第191期问答汇总

问题一 Q&#xff1a;snmp监控服务器风扇、温度等硬件信息需要要mib库吗&#xff1f; A&#xff1a;官网有相关的mib库可查&#xff0c;一般同大型号通用&#xff0c;直接去官方下就行。 问题二 Q&#xff1a;zabbix用的postgresqltimescaledb备份这个数据库的时候不想包含历…

【Linux】-Linux的权限

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树 ❤️‍&#x1fa79;作者宣言&#xff1a;认真写好每一篇博客 &#x1f4a8;作者gitee:gitee &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 …

【C++】入门必备小知识

C入门 1. 域2. 命名空间2.1命名空间的定义2.2 命名空间的使用 3. C输入和输出4. 缺省参数5. 函数重载6. 引用7. auto8. 范围for9.nullptr空指针10.内联函数 1. 域 域就是作用域&#xff0c;同一个域不可以用同名的变量&#xff0c;不同域可以用同名变量&#xff0c;遵循局部优…

案例11:Java超市管理系统设计与实现开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

5年时间里,自动化测试于我带来的意义,希望你也能早点知道

摘要&#xff1a;在我有限的软件测试经历里&#xff0c;曾有一段专职的自动化测试经历。 接触自动化 那时第一次上手自动化测试&#xff0c;团队里用的是Python&#xff0c;接口自动化测试的框架是requestsExcelJenkins&#xff0c;APP自动化测试的框架是Appium。 整个公司当…

寻找差值结构的最优顺序

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让A中有6个1 差值结构的每行只能是二进制的3&#xff0c;6&#xff0c;5..3列每列1的数量为1&#xff0c;2&#xff0c;3.B中全是0&#xff0c;排列组合…

“记录新时代 奋进新征程”省市主流媒体共赴省交通集团在建项目采风

近日&#xff0c;浙江省省市13家主流媒体集中走进杭绍甬高速杭绍段绍兴侧路面施工现场、杭金衢高速联络线PPP项目中村大桥及杨家山隧道等施工现场&#xff0c;近距离感受在建工程的标准化施工、数字化赋能以及产业工人队伍打造。 标准化、数字化齐头并进&#xff0c;保障路面施…

脂溶性荧光染料Cy7标记羧酸Cy7-COOH/Carboxylic acids星戈瑞

CY7-COOH是一种含有羧基的化合物&#xff0c;它的分子式为C37H45ClN2O2&#xff0c;分子量519.12。其化学结构中包含有一个吲哚菁骨架&#xff0c;以及一个羧基&#xff08;COOH&#xff09;官能团。它的分子式为C37H45ClN2O2&#xff0c;分子量519.12。CY7-COOH是一种近红外荧…

热烈祝贺百华鞋业通过山东省专精特新企业认定!

近日&#xff0c;山东省工业和信息化厅公布了山东省2023年度专精特新中小企业名单&#xff0c;百华鞋业荣誉上榜&#xff01; 专精特新中小企业是指具有“专业化、精细化、特色化、新颖化”特征的中小企业&#xff0c;多专注于产业链上某个环节&#xff0c;主营业务聚焦&#…

Three.js--》实现3d小岛模型搭建

目录 项目搭建 初始化three.js基础代码 设置环境背景 设置水面样式 添加天空小岛 今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目中才能灵活将所学知识运用起来&#xff0c;话不多说直接开始。 项目搭建 本案例还…

AR和VR技术的进展和应用:如何为移动应用开发添加更多趣味和体验?

章节一&#xff1a;引言 作为一名移动应用开发者&#xff0c;我一直致力于为用户提供创新和令人兴奋的体验。随着技术的不断发展&#xff0c;AR和VR技术成为了实现这一目标的有力工具。无论是增强现实还是虚拟现实&#xff0c;它们都能够将虚拟世界与现实世界相结合&#xff0…

可移动磁盘“未格式化”提示?教程帮你重获数据!

可移动磁盘在使用的过程中会出现各种奇怪的错误&#xff0c;比如小编今天碰到的一个&#xff0c;打开分区提示未格式化&#xff01;可移动磁盘“未格式化”提示&#xff1f;教程帮你重获数据&#xff01; 可移动磁盘“未格式化”提示&#xff1f;教程帮你重获数据&#xff01; …

【新星计划·2023】常用的5种VLAN的划分方式,你知道几种?

在说VLAN划分方式之前&#xff0c;先来说一说什么是VLAN&#xff1f;为什么需要划分VLAN&#xff1f; 一、什么是VLAN VLAN(Virtual Local Area Network)即虚拟局域网&#xff0c;是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。每个VLAN是一个广播域&#xff0c;VLA…

我还是劝你别去外包,干了4年,废了.....

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

AVUE样式、刷新、字典、清空搜索条件等操作

1、操作栏、表格样式的控制 2、下拉框字典的设置 3、日期格式的设置 const dateFormat function(row, value) { if (!value) return ; let format YYYY-mm-dd; let date new Date(value); const dataItem { Y: date.getFullYear().toString(), m: (date.ge…

使用midjourney搞出一套三国人物画像!

当下已进入如火如荼的全民AI时代&#xff0c;最近体验了下midjourney&#xff0c;使用它的以图生图功能生成出来一套三国人物画像&#xff0c;和大家分享下使用心得。 使用midjourney的准备工作 下载工具 使用midjourney生产图片依赖的工具和流程&#xff0c;大致如下&#x…

Parasoft和TASKING联手提供卓越的汽车软件开发和自动化测试

​​Parasoft与TASKING宣布建立合作 2023年4月26日&#xff0c;全球嵌入式软件测试解决方案领导者Parasoft宣布与汽车嵌入式软件开发工具行业领导者TASKING建立合作伙伴关系。Parasoft和TASKING的合作为汽车行业提供了一套完整的软件全生命周期解决方案&#xff0c;通过CI/CD工…

Shell基础学习---2、运算符、条件判断、流程控制

1 、运算符 1、基本语法 “$((运算式))”或‘“$[运算式]” 2、案例实操 2 、条件判断 1、基本语法 &#xff08;1&#xff09;test condition &#xff08;2&#xff09;[ condition ] &#xff08;注意condition前后要有空格&#xff09; 注意&#xff1a;条件非空即为tr…

批量域名综合信息查询-域名批量注册查询软件

域名综合信息查询 域名是一个网站的重要组成部分&#xff0c;它直接影响着网站的流量和排名。对于网站管理者来说&#xff0c;了解域名的综合信息是非常重要的。为了便于管理者查询和了解域名的综合信息&#xff0c;147SEO提供了免费的域名综合信息查询服务。下面&#xff0c;…