线程池延时类ScheduledExecutorService—比Timer更有效精确的延时工具
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更有效精确的延时工具相关推荐
- Android开发线程池管理类之ThreadPoolExecutor工具类
平常开发中网络请求自从Android4.0后强制要求放到子线程中避免主线程进行网络请求,一般很多人习惯直接通过new Thread的方法.不建议这样使用.我们用ThreadPoolExecutor线程 ...
- 并发编程系列之线程池工厂类:Executors
前言 上节讲了讲自定义线程池,今天我们来聊聊线程池框架,在实际开发中我们还是基本使用线程框架Executor给我们提供的一些工具类,Java提供的Executor都在JUC(java.util.con ...
- java线程池ThreadPoolExecutor类详解
线程池有哪些状态 1. RUNNING: 接收新的任务,且执行等待队列中的任务 Accept new tasks and process queued tasks 2. SHUTDOWN: 不接收 ...
- java 查询线程池_[代码全屏查看]-我的 Java 线程池测试类
[1].[代码] TestThreadPool.java package net.oschina.tester; import java.io.Serializable; import java.ut ...
- 0.5s c语言延时子程序集,用C语言实现精确的延时.doc
用C语言实现精确的延时 怎么用C语言做单片机的精确延时在单片机应用中,经常会遇到需要短时间延时的情况,一般都是几十到几百μs,并且需要很高的精度(比如用单片机驱动DS18B20时,误差容许的范围在十几 ...
- Android 线程池管理工具类
转自Android 线程池 public class AppExecutors {private static final String TAG = "AppExecutors"; ...
- 02java进阶03-异常、线程、同步、线程池、Lambda表达式、File类、递归
目录 一.异常 二.异常的处理 三.自定义异常 四.多线程 五.线程.同步 5.1.线程 5.2同步 5.3线程安全 5.4线程状态 六.等待唤醒机制 6.1 线程间通信 6.2 等待唤醒机制 6.3 ...
- Java基础加强重温_08:线程不安全、线程同步、线程状态、线程状态切换、线程池(Executors类、newFixedThreadPool)、死锁、Lambda表达式、Stream
摘要 Java基础加强重温_08: 线程安全(线程安全概念.线程不安全案例). 线程同步(同步代码块.同步方法.Lock锁,锁对象). 线程状态(new新建.Runnable可运行.Blocked锁阻 ...
- 线程池的使用以及其工具类的封装
/** * 线程池管理类 */ public class MyThreadPoolManager {/** * 说明:下面这些常量我是根据AsyncTask的源码配置的,大家可以根据自己需求自行配置 ...
最新文章
- [Java基础] 反射机制汇总
- javascript图书
- 自然语言处理python进阶(二)
- BugkuCTF-MISC题random color
- 修改Yarn的全局安装和缓存位置
- 5G让万物互联成为可能 大连接时代谋划物联网
- python给一列数据增加前缀_为Datafram的特定列添加前缀
- mac 如何安装/运行 kakfa
- 视频:青春期(青春痘1)
- 【春晚歌星】著名歌唱家拉齐献声人气民族好歌
- 带你用selenium IDE的录制第一个自动化测试脚本
- Python人工智能基础到实战课程-北方网视频
- 第 8 章 Python 计算生态
- k8s笔记0--k8s资料大全
- Android内存原理
- CANoe.DiVa 操作指南 - 预期响应设置
- AutoSAR的入门知识
- Oracle数据库中的临时表
- 直升机停机坪监控系统(HMS)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- [paper] DuReader