ScheduledExecutorService 简介

  • ScheduledExecutorService是 Java 中的一个接口,它是ExecutorService的子接口。它主要用于在给定的延迟之后或周期性地执行任务。这个接口提供了一种方便的方式来处理异步任务的调度,相比于传统的TimerTimerTask,它具有更好的灵活性和可靠性,特别是在处理多线程环境下的任务调度时。
  • 它在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的使用方法的更多相关文章

  1. java中substring的使用方法

    java中substring的使用方法 str=str.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str: str ...

  2. Java中Set的contains()方法

    Java中Set的contains()方法 -- hashCode与equals方法的约定及重写原则 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashCode() a ...

  3. [java,2017-05-16] java中清空StringBuffer的方法以及耗费时间比较

    java中清空StringBuffer的方法,我能想到的有4种: 1. buffer.setLength(0);  设置长度为0 2. buffer.delete(0, buffer.length() ...

  4. java中BorderLayout的使用方法

    相关设置: 使用BorderLayout布局上下左右中布局5个按键,单击中间的那个按键时就关闭窗口 代码: /**** *java中BorderLayout的使用方法 * 使用BorderLayout ...

  5. 【Java】Java中常用的String方法

    本文转载于:java中常用的String方法 1 length()字符串的长度 String a = "Hello Word!"; System.out.println(a.len ...

  6. Java中Set的contains()方法——hashCode与equals方法的约定及重写原则

    转自:http://blog.csdn.net/renfufei/article/details/14163329 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashC ...

  7. java中equals和hashCode方法随笔二

    前几天看了篇关于java中equals和hashCode方法的解析 1.Object类中的equals方法和hashCode方法. Object类中的equals和hashCode方法简单明了,所有的 ...

  8. java中static变量和方法的总结

    转自:http://blog.csdn.net/haobo920/article/details/5921621 java中static变量和方法的总结 java中一切皆是对象 一个类中对象的定义一般 ...

  9. Java中wait和sleep方法的区别

    1.两者的区别 这两个方法来自不同的类分别是Thread和Object 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁). wait ...

  10. java中File的delete()方法删除文件失败的原因

    java中File的delete()方法删除文件失败的原因 学习了:http://hujinfan.iteye.com/blog/1266387 的确是忘记关闭了: 引用原文膜拜一下: 一般来说 ja ...

随机推荐

  1. 如何基于Java解析国密数字证书

    一.说明 随着信息安全的重要性日益凸显,数字证书在各种安全通信场景中扮演着至关重要的角色.国密算法,作为我国自主研发的加密算法标准,其应用也愈发广泛.然而,在Java环境中解析使用国密算法的数字证书时 ...

  2. 深入理解ConcurrentHashMap

    HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进行put操作,调用了HashMap的putVal(),具体原因: 假设两个线程A.B都在进行put操作,并且hash函数计算 ...

  3. HTTP——简介

    HTTP   

  4. 深度DFS 和 广度BFS搜索算法学习

    目录 广度优先的动态图 深度优先的动态图 广度和深度的具体步骤 深度和广度的应用场景 图的两种遍历方式: 深度优先遍历(DFS--Depth First Search) 广度优先遍历(BFS--Bre ...

  5. 第16天:信息打点-CDN绕过&业务部署&漏洞回链&接口探针&全网扫描&反向邮件

    #CDN配置: 配置1:加速域名-需要启用加速的域名 配置2:加速区域-需要启用加速的地区 配置3:加速类型-需要启用加速的资源 #参考知识: 超级Ping:http://www.17ce.com/ ...

  6. python——celery异常consumer: Cannot connect to redis://127.0.0.1:6379/1: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk.

    1.检查 Redis 日志: 查看 Redis 的日志文件(通常位于 /var/log/redis/redis-server.log 或者根据你的配置文件中指定的位置),以获取有关错误原因的详细信息. ...

  7. 使用ftrace查找Kernel启动阶段的延时原因

    查找Kernel启动阶段的延时原因 1.确保内核配置了如下选项 CONFIG_FTRACE: "Tracers" CONFIG_FUNCTION_TRACER: "Ker ...

  8. python批量读取并显示图片,处理异常。

    今天写了一个批量读取并显示图片的代码,当做练习,方便以后拿来使用. import imageio import os import matplotlib.pyplot as plt filepath ...

  9. 如何集成化管理API_方便企业内外部调用?

    API 已成为企业数字战略中不可或缺的一部分.它们使不同软件系统.应用程序和服务之间能够高效.灵活地相互沟通.API不仅能提升企业内部各部门之间的协作效率,还能加强与外部合作伙伴及客户之间的互动. A ...

  10. three.js+vue智慧社区web3d数字孪生三维地图

    案例效果截图如下: 具体案例场景和功能,详见b站视频: https://www.bilibili.com/video/BV1Bb421E7WL/?vd_source=7d4ec9c9275b9c7d1 ...