JAVA中ScheduledExecutorService的使用方法
ScheduledExecutorService 简介
ScheduledExecutorService
是 Java 中的一个接口,它是ExecutorService
的子接口。它主要用于在给定的延迟之后或周期性地执行任务。这个接口提供了一种方便的方式来处理异步任务的调度,相比于传统的Timer
和TimerTask
,它具有更好的灵活性和可靠性,特别是在处理多线程环境下的任务调度时。- 它在
java.util.concurrent
包中,是 Java 并发编程的重要组成部分。通过ScheduledExecutorService
,可以有效地管理和调度多个异步任务,这些任务可以是一次性执行的,也可以是周期性重复执行的。
常用方法
schedule
schedule(Runnable command, long delay, TimeUnit unit)
- 功能描述:该方法用于安排一个任务(
Runnable
)在指定的延迟(delay
)之后执行一次。TimeUnit
是一个枚举类型,用于指定延迟的时间单位,例如TimeUnit.SECONDS
表示秒,TimeUnit.MILLISECONDS
表示毫秒等。 - 示例代码:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable task = () -> System.out.println("任务在延迟后执行");
scheduler.schedule(task, 5, TimeUnit.SECONDS);
scheduler.shutdown();
- 解释:在这个示例中,首先通过
Executors.newScheduledThreadPool(1)
创建了一个ScheduledExecutorService
对象,线程池大小为 1。然后定义了一个Runnable
任务,该任务只是简单地打印一条消息。接着使用schedule
方法安排这个任务在 5 秒(TimeUnit.SECONDS
)后执行。最后调用shutdown
方法来优雅地关闭ScheduledExecutorService
,防止资源泄漏。
scheduleAtFixedRate
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
- 功能描述:用于安排一个任务在初始延迟(
initialDelay
)之后开始执行,然后以固定的频率(period
)重复执行。如果任务的执行时间超过了指定的周期(period
),下一次执行会在当前任务执行完成后立即开始,不会等待一个完整的周期。 - 示例代码:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable task = () -> System.out.println("周期性任务执行");
scheduler.scheduleAtFixedRate(task, 2, 3, TimeUnit.SECONDS);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
scheduler.shutdown();
- 解释:在这个例子中,任务会在 2 秒(
initialDelay
)后首次执行,然后每隔 3 秒(period
)执行一次。通过Thread.sleep(10000)
让主线程等待一段时间,以便观察任务的周期性执行。最后关闭ScheduledExecutorService
。
scheduleWithFixedDelay
scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
- 功能描述:安排一个任务在初始延迟(
initialDelay
)之后开始执行,并且在每次执行完成后,等待固定的延迟(delay
)时间后再执行下一次任务。这与scheduleAtFixedRate
不同,scheduleAtFixedRate
是按照固定的频率执行,而这个方法是在上一次任务执行完成后等待固定的延迟时间再执行下一次。 - 示例代码:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable task = () -> {
System.out.println("任务开始执行");
try {
Thread.sleep(2000); // 模拟任务执行时间
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务执行完成");
};
scheduler.scheduleWithFixedDelay(task, 2, 3, TimeUnit.SECONDS);
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
e.printStackTrace();
}
scheduler.shutdown();
- 解释:在这个示例中,任务首先在 2 秒(
initialDelay
)后开始执行。任务本身会模拟执行 2 秒(通过Thread.sleep(2000)
),然后在任务执行完成后,等待 3 秒(delay
)再执行下一次任务。通过Thread.sleep(15000)
让主线程等待足够长的时间来观察任务的执行情况,最后关闭ScheduledExecutorService
。
JAVA中ScheduledExecutorService的使用方法的更多相关文章
- java中substring的使用方法
java中substring的使用方法 str=str.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str: str ...
- Java中Set的contains()方法
Java中Set的contains()方法 -- hashCode与equals方法的约定及重写原则 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashCode() a ...
- [java,2017-05-16] java中清空StringBuffer的方法以及耗费时间比较
java中清空StringBuffer的方法,我能想到的有4种: 1. buffer.setLength(0); 设置长度为0 2. buffer.delete(0, buffer.length() ...
- java中BorderLayout的使用方法
相关设置: 使用BorderLayout布局上下左右中布局5个按键,单击中间的那个按键时就关闭窗口 代码: /**** *java中BorderLayout的使用方法 * 使用BorderLayout ...
- 【Java】Java中常用的String方法
本文转载于:java中常用的String方法 1 length()字符串的长度 String a = "Hello Word!"; System.out.println(a.len ...
- Java中Set的contains()方法——hashCode与equals方法的约定及重写原则
转自:http://blog.csdn.net/renfufei/article/details/14163329 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashC ...
- java中equals和hashCode方法随笔二
前几天看了篇关于java中equals和hashCode方法的解析 1.Object类中的equals方法和hashCode方法. Object类中的equals和hashCode方法简单明了,所有的 ...
- java中static变量和方法的总结
转自:http://blog.csdn.net/haobo920/article/details/5921621 java中static变量和方法的总结 java中一切皆是对象 一个类中对象的定义一般 ...
- Java中wait和sleep方法的区别
1.两者的区别 这两个方法来自不同的类分别是Thread和Object 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁). wait ...
- java中File的delete()方法删除文件失败的原因
java中File的delete()方法删除文件失败的原因 学习了:http://hujinfan.iteye.com/blog/1266387 的确是忘记关闭了: 引用原文膜拜一下: 一般来说 ja ...
随机推荐
- Vue3——SVG 图标配置
1. SVG 图标配置 安装 SVG 依赖插件 vite-plugin-svg-icons npm i vite-plugin-svg-icons -D npm install fast-glob - ...
- 【译】通过新的 WinUI 工作负荷和模板改进,深入原生 Windows 开发
在 Build 2024 上,WinUI 团队宣布将重新关注 WinUI,将其作为我们推荐的原生 Windows 应用开发的首要应用开发框架之一.为了使其尽可能无缝和轻松地进入编码,我们创建了一个新的 ...
- Android10.0系统启动之Launcher(桌面)启动流程-[Android取经之路]
Launcher的启动经过了三个阶段: 第一个阶段:SystemServer完成启动Launcher Activity的调用 第二个阶段:Zygote()进行Launcher进程的Fork操作 第三个 ...
- 2021年8月国产数据库排行榜:TiDB稳榜首,达梦返前三,Kingbase进十强,各厂商加速布局云生态
8月份的国产数据库流行度排行榜新鲜出炉.本月共有139个数据库参与了排名. 先来看看排行榜前五名.PingCAP的TiDB分数连续第二个月上涨,总分达到630.21,以136.48的分数差拉开了与第二 ...
- 简述 JavaScript脚本的执行原理?
js 是一种动态 . 弱类型 . 基于原型的语言 ,通过浏览器可以直接执行: 当浏览器遇到 <script></script>标记时 , 会执行标记之间的js 代码:然后js ...
- Kubernetes 边缘节点抓不到监控指标?试试这个方法!
KubeSphere v3.1.0 通过集成 KubeEdge,将节点和资源的管理延伸到了边缘,也是 KubeSphere 正式支持边缘计算的第一个版本. 笔者也第一时间搭建和试用了边缘节点相关的功能 ...
- 听说过Paas、Saas和Iaas,那你听说过Apaas吗?
互联网行业就喜欢搞一些单词的缩写,在云计算行业,前者有SaaS.PaaS.IaaS,最近两三年APaaS的概念又开始被关注.APaaS到底是什么意思,有什么用,与前三者的区别是什么?本文将对这些问题进 ...
- ToDesk云电脑堪比万元PC?黑悟空、老头环及战锤40K实测体验!
2009年,OnLive首次在旧金山游戏开发者大会推出"云游戏"的概念,但受限于当时的网络宽带技术,云游戏并不被十分看好.现如今,5G时代已然到来,数据通量和画质传输给予云游戏崛起 ...
- 电脑配置不够玩不了原神、剑三和魔兽世界?ToDesk云电脑来帮你!
原神.剑网三.魔兽世界这种吃配置的游戏,对电脑硬件和软件的要求可都不低,所以当游戏玩家遇到配置一般的电脑,就只能望游戏而兴叹吗? 当然不用!云电脑成为你的游戏电脑平替之选. 用云电脑来玩游戏,不仅对你 ...
- 修改Linux服务的文件打开句柄数
在bash中,有个ulimit命令,提供了对shell及该shell启动的进程的可用资源控制.主要包括打开文件描述符数量.用户的最大进程数量.coredump文件的大小等. 在centos 5/6 等 ...