iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >JavaScheduledExecutorService的具体使用
  • 503
分享到

JavaScheduledExecutorService的具体使用

ScheduledExecutorService 2023-05-19 17:05:09 503人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录1. 延迟不循环任务schedule方法2. 延迟且循环cheduleAtFixedRate方法3. 严格按照一定时间间隔执行``ScheduledExecutorService

ScheduledExecutorService线程池的特性,也可以实现任务循环执行,可以看作是一个简单地定时任务组件,因为有线程池特性,所以任务之间可以多线程并发执行,互不影响,当任务来的时候,才会真正创建线程去执行

我们在做一些普通定时循环任务时可以用它,比如定时刷新字典常量,只需要不断重复执行即可,这篇文章讲解一下它的用法以及注意事项,不涉及底层原理

注意:我们都知道,在使用线程池的时候,如果我们的任务出现异常没有捕获,那么线程会销毁被回收,不会影响其他任务继续提交并执行,但是在这里,如果你的任务出现异常没有捕获,会导致后续的任务不再执行,所以一定要try...catch

1. 延迟不循环任务schedule方法

schedule(Runnable command, long delay, TimeUnit unit)

参数1:任务
参数2:方法第一次执行的延迟时间
参数3:延迟单位
说明:延迟任务,只执行一次(不会再次执行),参数2为延迟时间

案例说明:

@Component
@Slf4j
public class MineExecutors {
    private final static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5);
    private final static SimpleDateFORMat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:sss");
    @PostConstruct
    public void init() {
        scheduler.schedule(() -> {
            try {
                log.info("开始执行...time {}", format.format(new Date()));
                Thread.sleep(1000);
                log.info("执行结束...time {}", format.format(new Date()));
            } catch (Exception e) {
                log.error("定时任务执行出错");
            }
        }, 5, TimeUnit.SECONDS);
		log.info("初始化成功 {}", format.format(new Date()));
    }
}

可以看到任务执行时间为初始化完成后5s才开始执行,且只执行一次

2. 延迟且循环cheduleAtFixedRate方法

cheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
参数1:任务
参数2:初始化完成后延迟多长时间执行第一次任务
参数3:任务时间间隔
参数4:单位

方法解释:是以上一个任务开始的时间计时,比如period为5,那5秒后,检测上一个任务是否执行完毕,如果上一个任务执行完毕,则当前任务立即执行,如果上一个任务没有执行完毕,则需要等上一个任务执行完毕后立即执行,如果你的任务执行时间超过5秒,那么任务时间间隔参数将无效,任务会不停地循环执行,由此可得出该方法不能严格保证任务按一定时间间隔执行

错误:任务连续执行案例:

@Component
@Slf4j
public class MineExecutors {
    private final static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5);
    private final static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    @PostConstruct
    public void init() {
        scheduler.scheduleAtFixedRate(() -> {
            try {
                log.info("开始执行...time {}", format.format(new Date()));
                Thread.sleep(3000);
                log.info("执行结束...time {}", format.format(new Date()));
            } catch (Exception e) {
                log.error("定时任务执行出错");
            }
        }, 0, 2, TimeUnit.SECONDS);
        log.info("初始化成功 {}", format.format(new Date()));
    }
}

由上面代码可以看出,任务执行需要3秒,而我们设定的任务时间间隔为2秒,如此就会导致任务连续执行,该方法不能严格保证任务按照规定的时间间隔执行,如果你的任务执行时间可以保证忽略不计,则可以使用该方法,我们可以看到下面日志,上一个任务的执行结束时间与下一个任务的开始时间一致,所以任务连续循环执行了

正确案例:

@Component
@Slf4j
public class MineExecutors {
    private final static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5);
    private final static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    @PostConstruct
    public void init() {
        scheduler.scheduleAtFixedRate(() -> {
            try {
                log.info("开始执行...time {}", format.format(new Date()));
                Thread.sleep(1000);
                log.info("执行结束...time {}", format.format(new Date()));
            } catch (Exception e) {
                log.error("定时任务执行出错");
            }
        }, 0, 3, TimeUnit.SECONDS);
        log.info("初始化成功 {}", format.format(new Date()));
    }
}

可以看到任务以上一次任务的开始时间,按3秒一次的方式执行

3. 严格按照一定时间间隔执行``

scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit);

参数1:任务
参数2:初始化完成后延迟多长时间执行第一次任务
参数3:任务执行时间间隔
参数4:单位
解释:以上一次任务执行结束时间为准,加上任务时间间隔作为下一次任务开始时间,由此可以得出,任务可以严格按照时间间隔执行

案例:

@Component
@Slf4j
public class MineExecutors {
    private final static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5);
    private final static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    @PostConstruct
    public void init() {
        scheduler.scheduleWithFixedDelay(() -> {
            try {
                log.info("开始执行...time {}", format.format(new Date()));
                Thread.sleep(5000);
                log.info("执行结束...time {}", format.format(new Date()));
            } catch (Exception e) {
                log.error("定时任务执行出错");
            }
        }, 0, 3, TimeUnit.SECONDS);
        log.info("初始化成功 {}", format.format(new Date()));
    }
}

由下图日志可以看出,下次任务的开始时间是在上一次任务结束时间+任务时间间隔为准的,严格按照任务时间间隔,规律执行,如果你的任务需要保证严格的时间间隔,可以用该方法启动任务

其他用法与线程池没有差异了,例如ThreadFactory作为参数传入,自定义线程池内线程名称之类的,不多解释了。

到此这篇关于Java ScheduledExecutorService的具体使用的文章就介绍到这了,更多相关ScheduledExecutorService内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScheduledExecutorService的具体使用

本文链接: https://www.lsjlt.com/news/213558.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScheduledExecutorService的具体使用
    目录1. 延迟不循环任务schedule方法2. 延迟且循环cheduleAtFixedRate方法3. 严格按照一定时间间隔执行``ScheduledExecutorService...
    99+
    2023-05-19
    ScheduledExecutorService
  • Quartz.NET的具体使用
    目录一、什么是Quartz.NET?二、Quartz.NET可以做什么?三、ASP.NET Core如何使用Quartz.NET?四、Quartz的cron表达式一、什么是Quart...
    99+
    2024-04-02
  • QtQFrame的具体使用
    目录1.概述2.常用数据接口3.示例1.概述 void setFrameShape(Shape) QFrame继承QWidget,QFrame类是具有框架的小部件的基类,例如QLab...
    99+
    2024-04-02
  • python__add__()的具体使用
    __add__(),  同一个类,两个对象相加的实现逻辑,重写 + class Myclass(object): def __init__(self,value):...
    99+
    2023-02-27
    python __add__()使用 python __add__
  • pythonhttpx的具体使用
    目录什么是 Httpx安装 Httpx发送 HTTP 请求发送异步 HTTP 请求设置请求标头设置请求参数发送请求体发送 JSON 数据设置超时错误处理证书验证使用代理上传文件使用 ...
    99+
    2023-05-14
    python httpx
  • np.unique()的具体使用
    目录一、np.unique() 介绍二、np.unique() 原型三、实例参考链接一、np.unique() 介绍 对于一维数组或者列表,np.unique() 函数 去除其中重复...
    99+
    2023-03-14
    np.unique()使用 np.unique()
  • python-httpx的具体使用
    目录安装创建请求自定义头部超时时间SSL证书认证请求类型Query ParamsForm表单文件上传JSON二进制数据响应响应类型Cookie重定向历史httpx.Client合并/...
    99+
    2024-04-02
  • Vuex localStorage的具体使用
    目录状态管理的必要性localStorage储存和获取数据生命周期VuexVuex的概念Vuex的工作流程Vuex和localStorage的区别总结前端开发中,状态管理是一个很重要...
    99+
    2023-05-20
    Vuex localStorage
  • numpy.reshape(-1,1)的具体使用
    数组新的shape属性应该要与原来的配套,如果等于-1的话,那么Numpy会根据剩下的维度计算出数组的另外一个shape属性值。 举个例子: x = np.array([[2, 0]...
    99+
    2024-04-02
  • GO的range具体使用
    目录GO 语言的 for…range  能做什么呢?for…range  如何使用 ?数组 array切片 slicechannel 通道for…rang...
    99+
    2024-04-02
  • JavaScript WeakMap的具体使用
    目录前言一、为何选用WeakMap1. Map2. WeakMap二、WeakMap原型方法总结前言 我在处理一个复杂对象的深拷贝方法时接触到WeakMap, 其作为缓存结构以解决对...
    99+
    2023-02-17
    JavaScript WeakMap
  • C# Volatile的具体使用
    目录​1.Overview2.Detail3.Conclusion4.Reference​1.Overview 经常研究.NET源码库的小伙伴会经常看到一个关...
    99+
    2024-04-02
  • podman容器工具的具体使用
    目录podman简介Podman和Docker的主要区别是什么?podman安装使用配置镜像加速相关工具podman简介 Podman是一个开源项目,可在大多数Linux平台上使用并...
    99+
    2024-04-02
  • numpy.insert()的具体使用方法
    目录1. 参数说明2. 示例2.1. 插入一列,值为标量2.2. 插入一列,值为一维矩阵2.3. 插入多列,值为标量2.4. 输入为一维向量2.5. 输入为矩阵numpy.inser...
    99+
    2023-02-09
    numpy.insert()使用
  • Pytest断言的具体使用
    目录assert断言方法异常断言Excepiton检查断言装饰器Pytest使用的断言是使用python内置的断言assert。Python assert(断言)用于判断一个表达式,...
    99+
    2023-02-07
    Pytest断言
  • React中useRef的具体使用
    相信有过React使用经验的人对ref都会熟悉,它可以用来获取组件实例对象或者是DOM对象。 而useRef这个hooks函数,除了传统的用法之外,它还可以“跨渲染周期”保存数据。 ...
    99+
    2024-04-02
  • nginx之queue的具体使用
    目录一、简介二、数据结构三、相关API3.1 初始化一个队列3.2 判断队列是否为空3.3 队头插入节点3.4 队尾插入节点3.5 从队列中移除某个节点3.6 将队列从某个节点拆分成...
    99+
    2024-04-02
  • Pythonisalnum()函数的具体使用
    目录1、包含字母和数字的情况2、汉字和其他语言的情况3、空字符串、制表符、特殊符号、标点符号isalnum() 可以判断字符串的字符是否全都是「字母」和「数字」。 语法 string...
    99+
    2023-08-08
    Python isalnum()
  • pandas.DataFrame.iloc的具体使用详解
    目录第一种 整数做索引第二种 列表或数组做索引第三种 利用切片做索引第四种 Boolean数组做索引第五种 带一个参数的可调用函数做索引今天学习时遇到了这个方法,为了加深理解做一下笔...
    99+
    2024-04-02
  • Pythonlistsort方法的具体使用
    目录描述 语法 使用示例 1. 所有参数都省略 2. 指定key参数 3. 指定reverse参数 注意事项 1. sort函数会改变原列表顺序 2. 列表元素类型不一致 3. Py...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作