ScheduledExecutorService

前言

  在Java中我们一般使用Timer来进行延时/周期执行操作,Timer的内部只有一个线程,如果有多个任务的话就会顺序执行,这样我们的延迟时间和循环时间就会出现问题。除此之外:在多线程并发执行定时操作时,Timer运行多个TimerTask,如果其中一个任务没有异常没有捕获,那所有任务都将终止。还有就是,Timer是基于绝对时间,而ScheduledExecutorService是基于相对时间的,这个看情况而定,一般基于相对时间更灵活一些。所以作为Timer的替代品,在对延迟任务和循环任务要求严格的时候,最好使用ScheduledExecutorService。
ScheduledExecutorService提供了三种方法来进行延时/周期操作:schedule、scheduleAtFixedRate、scheduleWithFixedDelay。

schedule方法

ScheduledExecutorService用于延迟一段时间后执行任务或者周期性的执行任务.通常使用Executor类的工厂方法去实例化一个ScheduledExecutorService是一个比较好的方式。.

 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1000);
//延迟两秒打印fsd,这里使用了lamda表达式简化,相当于new Runable()scheduledThreadPool.schedule(() ->System.out.println("fsd"), 2, TimeUnit.SECONDS);

scheduleAtFixedRate方法

scheduleAtFixedRate()方法在延迟一段时间之后周期性的执行一个任务.下面的代码将会先延迟1秒之后首次执行,之后每隔3秒执行,不管任务耗时多久,3秒后都立即执行下一个任务。

    ScheduledExecutorService  executorService =Executors.newSingleThreadScheduledExecutor();
//第一次延迟一秒打印,后每三秒打印一次,这里使用了lamda表达式简化,相当于new Runable()executorService.scheduleAtFixedRate(() ->System.out.println("fsd"),1,3,TimeUnit.SECONDS);

总结一下就是:scheduleAtFixedRate是按照上一次任务的发起时间计算下一次任务的开始时间。

scheduleWithFixedDelay方法

如果需要任务周期性执行的时候保持固定的时间间隔,应该使用scheduleWithFixedDalay()方法.如下的代码保证上一次任务执行完(不管多久)过10秒之后再执行下一次任务.

    ScheduledExecutorService  executorService =Executors.newSingleThreadScheduledExecutor();
//第一次延迟一秒打印,后每三秒打印一次,这里使用了lamda表达式简化,相当于new Runable()executorService.scheduleWithFixedDelay(() ->System.out.println("fsd"),1,3,TimeUnit.SECONDS);

总结一下就是:.scheduleWithFixedDelay以上一次任务的结束时间计算下一次任务的开始时间
**注意:
如果ExecutorService被关闭,或者在任务执行过程中抛出了一个异常,那么周期性执行的任务将会终止.。所以最好在Runable中的run方法中捕获所有异常,保证循环的进行,如下:

public class MyThread implements Runnable{@Overridepublic void run() {try { int sleepNumber = random.nextInt(3);if(sleepNumber ==2){int error = 1/0;}} catch (Exception e) {e.printStackTrace();}
}

HDFS老化管理中用的Timer

作者:魂之挽歌w
链接:https://www.jianshu.com/p/7de47a45edf4
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

线程池延时类ScheduledExecutorService—比Timer更有效精确的延时工具相关推荐

  1. Android开发线程池管理类之ThreadPoolExecutor工具类

    平常开发中网络请求自从Android4.0后强制要求放到子线程中避免主线程进行网络请求,一般很多人习惯直接通过new Thread的方法.不建议这样使用.我们用ThreadPoolExecutor线程 ...

  2. 并发编程系列之线程池工厂类:Executors

    前言 上节讲了讲自定义线程池,今天我们来聊聊线程池框架,在实际开发中我们还是基本使用线程框架Executor给我们提供的一些工具类,Java提供的Executor都在JUC(java.util.con ...

  3. java线程池ThreadPoolExecutor类详解

    线程池有哪些状态 1. RUNNING:  接收新的任务,且执行等待队列中的任务 Accept new tasks and process queued tasks  2. SHUTDOWN: 不接收 ...

  4. java 查询线程池_[代码全屏查看]-我的 Java 线程池测试类

    [1].[代码] TestThreadPool.java package net.oschina.tester; import java.io.Serializable; import java.ut ...

  5. 0.5s c语言延时子程序集,用C语言实现精确的延时.doc

    用C语言实现精确的延时 怎么用C语言做单片机的精确延时在单片机应用中,经常会遇到需要短时间延时的情况,一般都是几十到几百μs,并且需要很高的精度(比如用单片机驱动DS18B20时,误差容许的范围在十几 ...

  6. Android 线程池管理工具类

    转自Android 线程池 public class AppExecutors {private static final String TAG = "AppExecutors"; ...

  7. 02java进阶03-异常、线程、同步、线程池、Lambda表达式、File类、递归

    目录 一.异常 二.异常的处理 三.自定义异常 四.多线程 五.线程.同步 5.1.线程 5.2同步 5.3线程安全 5.4线程状态 六.等待唤醒机制 6.1 线程间通信 6.2 等待唤醒机制 6.3 ...

  8. Java基础加强重温_08:线程不安全、线程同步、线程状态、线程状态切换、线程池(Executors类、newFixedThreadPool)、死锁、Lambda表达式、Stream

    摘要 Java基础加强重温_08: 线程安全(线程安全概念.线程不安全案例). 线程同步(同步代码块.同步方法.Lock锁,锁对象). 线程状态(new新建.Runnable可运行.Blocked锁阻 ...

  9. 线程池的使用以及其工具类的封装

    /** * 线程池管理类 */ public class MyThreadPoolManager {/** * 说明:下面这些常量我是根据AsyncTask的源码配置的,大家可以根据自己需求自行配置 ...

最新文章

  1. [Java基础] 反射机制汇总
  2. javascript图书
  3. 自然语言处理python进阶(二)
  4. BugkuCTF-MISC题random color
  5. 修改Yarn的全局安装和缓存位置
  6. 5G让万物互联成为可能 大连接时代谋划物联网
  7. python给一列数据增加前缀_为Datafram的特定列添加前缀
  8. mac 如何安装/运行 kakfa
  9. 视频:青春期(青春痘1)
  10. 【春晚歌星】著名歌唱家拉齐献声人气民族好歌
  11. 带你用selenium IDE的录制第一个自动化测试脚本
  12. Python人工智能基础到实战课程-北方网视频
  13. 第 8 章 Python 计算生态
  14. k8s笔记0--k8s资料大全
  15. Android内存原理
  16. CANoe.DiVa 操作指南 - 预期响应设置
  17. AutoSAR的入门知识
  18. Oracle数据库中的临时表
  19. 直升机停机坪监控系统(HMS)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  20. [paper] DuReader

热门文章

  1. 微信小程序 通过场景值判断从什么路径进入微信小程序
  2. 《新学期,新FLAG》——觉醒
  3. superset 二次开发之看板渲染为深色大屏(图表文字颜色更改)
  4. torch.randn()参数size与输出张量形状详解
  5. 软件加密技术和注册机制 ---- 加密一
  6. 从0到1搞定在线OJ
  7. [翻译]循环神经网络不可思议的有效性
  8. 阿里旺旺聊天发包CALL发送消息
  9. 破解 Visual assist x for vs2010
  10. 【Linux】LINUX内核目录文件说明