实例分析ScheduledThreadPoolExecutor与Timer的区别
本文分享自华为云社区《【高并发】ScheduledThreadPoolExecutor与Timer的区别和简单示例》,作者:冰 河 。
JDK 1.5开始提供ScheduledThreadPoolExecutor类,ScheduledThreadPoolExecutor类继承ThreadPoolExecutor类重用线程池实现了任务的周期性调度功能。在JDK 1.5之前,实现任务的周期性调度主要使用的是Timer类和TimerTask类。本文,就简单介绍下ScheduledThreadPoolExecutor类与Timer类的区别,ScheduledThreadPoolExecutor类相比于Timer类来说,究竟有哪些优势,以及二者分别实现任务调度的简单示例。二者的区别线程角度Timer是单线程模式,如果某个TimerTask任务的执行时间比较久,会影响到其他任务的调度执行。ScheduledThreadPoolExecutor是多线程模式,并且重用线程池,某个ScheduledFutureTask任务执行的时间比较久,不会影响到其他任务的调度执行。系统时间敏感度Timer调度是基于操作系统的绝对时间的,对操作系统的时间敏感,一旦操作系统的时间改变,则Timer的调度不再精确。ScheduledThreadPoolExecutor调度是基于相对时间的,不受操作系统时间改变的影响。是否捕获异常Timer不会捕获TimerTask抛出的异常,加上Timer又是单线程的。一旦某个调度任务出现异常,则整个线程就会终止,其他需要调度的任务也不再执行。ScheduledThreadPoolExecutor基于线程池来实现调度功能,某个任务抛出异常后,其他任务仍能正常执行。任务是否具备优先级Timer中执行的TimerTask任务整体上没有优先级的概念,只是按照系统的绝对时间来执行任务。ScheduledThreadPoolExecutor中执行的ScheduledFutureTask类实现了java.lang.Comparable接口和java.util.concurrent.Delayed接口,这也就说明了ScheduledFutureTask类中实现了两个非常重要的方法,一个是java.lang.Comparable接口的compareTo方法,一个是java.util.concurrent.Delayed接口的getDelay方法。在ScheduledFutureTask类中compareTo方法方法实现了任务的比较,距离下次执行的时间间隔短的任务会排在前面,也就是说,距离下次执行的时间间隔短的任务的优先级比较高。而getDelay方法则能够返回距离下次任务执行的时间间隔。是否支持对任务排序Timer不支持对任务的排序。ScheduledThreadPoolExecutor类中定义了一个静态内部类DelayedWorkQueue,DelayedWorkQueue类本质上是一个有序队列,为需要调度的每个任务按照距离下次执行时间间隔的大小来排序能否获取返回的结果Timer中执行的TimerTask类只是实现了java.lang.Runnable接口,无法从TimerTask中获取返回的结果。ScheduledThreadPoolExecutor中执行的ScheduledFutureTask类继承了FutureTask类,能够通过Future来获取返回的结果。
通过以上对ScheduledThreadPoolExecutor类和Timer类的分析对比,相信在JDK 1.5之后,就没有使用Timer来实现定时任务调度的必要了。二者简单的示例
这里,给出使用Timer和ScheduledThreadPoolExecutor实现定时调度的简单示例,为了简便,我这里就直接使用匿名内部类的形式来提交任务。Timer类简单示例
源代码示例如下所示。package io.binghe.concurrent.lab09; import java.util.Timer; import java.util.TimerTask; /** * @author binghe * @version 1.0.0 * @description 测试Timer */ public class TimerTest { public static void main(String[] args) throws InterruptedException { Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { System.out.println("测试Timer类"); } }, 1000, 1000); Thread.sleep(10000); timer.cancel(); } }
运行结果如下所示。测试Timer类 测试Timer类 测试Timer类 测试Timer类 测试Timer类 测试Timer类 测试Timer类 测试Timer类 测试Timer类 测试Timer类 ScheduledThreadPoolExecutor类简单示例
源代码示例如下所示。package io.binghe.concurrent.lab09; import java.util.concurrent.*; /** * @author binghe * @version 1.0.0 * @description 测试ScheduledThreadPoolExecutor */ public class ScheduledThreadPoolExecutorTest { public static void main(String[] args) throws InterruptedException { ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3); scheduledExecutorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println("测试测试ScheduledThreadPoolExecutor"); } }, 1, 1, TimeUnit.SECONDS); //主线程休眠10秒 Thread.sleep(10000); System.out.println("正在关闭线程池..."); // 关闭线程池 scheduledExecutorService.shutdown(); boolean isClosed; // 等待线程池终止 do { isClosed = scheduledExecutorService.awaitTermination(1, TimeUnit.DAYS); System.out.println("正在等待线程池中的任务执行完成"); } while(!isClosed); System.out.println("所有线程执行结束,线程池关闭"); } }
运行结果如下所示。测试测试ScheduledThreadPoolExecutor 测试测试ScheduledThreadPoolExecutor 测试测试ScheduledThreadPoolExecutor 测试测试ScheduledThreadPoolExecutor 测试测试ScheduledThreadPoolExecutor 测试测试ScheduledThreadPoolExecutor 测试测试ScheduledThreadPoolExecutor 测试测试ScheduledThreadPoolExecutor 测试测试ScheduledThreadPoolExecutor 正在关闭线程池... 测试测试ScheduledThreadPoolExecutor 正在等待线程池中的任务执行完成 所有线程执行结束,线程池关闭
注意:关于Timer和ScheduledThreadPoolExecutor还有其他的使用方法,这里,我就简单列出以上两个使用示例,更多的使用方法大家可以自行实现。
中华行八十六李白情动桃花潭八十六李白情动桃花潭邢少山李白的一首赠汪伦,使汪伦成为一位名人,使泾县的桃花潭名扬千古与四海。如今,桃花潭成了旅游圣地,然而当时桃花潭并不有名,汪伦更是无名之辈,怎么汪伦与诗仙李白
秋季自驾正当时西九华山的美,不止一个视角九月如约而至,褪去了夏日的热烈,蝉鸣渐歇桂花飘香,微风带来了秋的气息。此时,正是自驾出行的好时节,不妨带着满怀丰收的幸福,暂时放下疲惫与烦躁,带家人爱人朋友一起来西九华山享受轻松与
旧影天下第一观白云观的盛大庙会白云观位于北京西城区白云路是道教全真派的第一丛林。全真龙门派祖师邱处机曾主持这一宫观,羽化后亦藏遗蜕于此,故而后世全真龙门派道徒尊白云观为全真龙门派的祖庭。白云观作为全真龙门派的第
长安十二时辰解码你不知道的天下第一名楼花萼相辉楼典出诗经小雅棠棣,棠棣之花,鄂不韡韡(wiwi),凡今之人,莫如兄弟。意思是说兄弟之间的情谊,就如同这花与萼一样,相互辉映。花萼相辉楼的楼名,很好地象征了唐玄宗兄弟之间的
互联网跳国企,以为上岸了,结果降薪30,周末还义务加班,后悔从互联网进国企大概是很多人羡慕的归宿了,但一位从深信服公司跳进中字头国企的网友却发现自己掉坑里了本以为自己上岸了,结果顶着国企的名,却是互联网的作息,工资降了30,最坑的是周末义务
鲨鱼哥创业者必经的无人之境至暗时刻,逆境中到底如何破局大家好,我是鲨鱼哥!每一个创业者必然会经历一段无人之境。什么是无人之境,至暗时刻呢?每一个创业者,这一生必然会经历两到三次以上的至暗时刻。至暗时刻,无人之境,你就像走在一个沙漠里一
中美达成合作协议!热门中概股大涨,网友服软了?8月31日,美股热门中概股集体走强,哔哩哔哩百度拼多多涨近6,网易涨超4,阿里巴巴涨近3。究其原因,有机构分析认为当前中美双方审计监管合作协议的达成,为中概审计问题提供了良好的开端
吃定中国了?狂卖1。7亿吨,澳企中国将长期想要澳大利亚铁矿石众所周知,世界上有四大矿业公司,尤其是铁矿石方面,几乎垄断了全球的开采运输和销售,其中有一家企业FMG算是最小的,当然相比其他企业自然是巨头般存在。企业虽然比不上淡水河谷力拓这类老
2010年金砖五国GDP之和是美国的76。98,现在是多少呢?金砖国家的概念是2001年美国高盛公司首席经济师吉姆奥尼尔提出来的,当时全球4个发展中国家中国印度俄罗斯和巴西,发展势头迅猛,经济都处于爆发的前夕。而这4个国家的首字母连起来是英文
闲鱼电商走到了十字路口近年来,大众对于商品的剩余价值十分注重,二手商品的转卖的需求日益上涨,二手平台闲鱼也受到了大众的青睐。但就在闲鱼多轮探索中,还是发现尚存许多问题,闲鱼电商若想在未来能够实现新阶段的
饿死还是冻死数百万英国老人担心自己不能活过这个冬天根据英国养老金服务机构的数据,大约44达到目前英国国家养老金年龄(66岁)的人表示养老金是他们的主要收入来源。大多数养老金领取者的基本国家养老金为每周141。85英镑,每年约740