ScheduledExecutorService和timer的异同

简介: <p>先来个传统的Timer的例子:</p> <div class="dp-highlighter bg_java"> <div class="bar"> <div class="tools"><strong>[java]</strong> <a target="_blank" href="http://blog.csdn.net/cages/article/details/730

先来个传统的Timer的例子:

  1. package com.jerry.concurrency;  
  2.   
  3. import java.text.ParseException;  
  4. import java.text.SimpleDateFormat;  
  5. import java.util.Date;  
  6. import java.util.Timer;  
  7. import java.util.TimerTask;  
  8.   
  9. public class TraditionalTask {  
  10.       
  11.   
  12.     public static void main(String[] args) throws ParseException {  
  13.         Timer myTimer = new Timer();  
  14.         myTimer.schedule(new Worker(), 1000);//1秒后执行  
  15. //      2012-02-28 09:58:00执行  
  16.         myTimer.schedule(new Worker(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2012-02-28 09:58:00"));  
  17.         myTimer.schedule(new Worker(), 5000,1000);//5秒后执行 每一秒执行一次  
  18. //      2012-02-28 09:58:00执行一次 以后每秒执行一次,如果设定的时间点在当前时间之前,任务会被马上执行,然后开始按照设定的周期定时执行任务  
  19.         myTimer.schedule(new Worker(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2012-02-28 09:58:00"),1000);  
  20.         myTimer.scheduleAtFixedRate(new Worker(), 5000,1000);//5秒后执行 每一秒执行一次 如果该任务因为某些原因(例如垃圾收集)而延迟执行,那么接下来的任务会尽可能的快速执行,以赶上特定的时间点  
  21.         myTimer.scheduleAtFixedRate(new Worker(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2012-02-28 09:58:00"),1000);//和上个类似  
  22.     }  
  23. }  
  24.   
  25.   
  26. class Worker extends TimerTask {  
  27.   
  28.     @Override  
  29.     public void run() {  
  30.           
  31.         System.out.println("我被执行了!"+"时间是:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));  
  32.     }  
  33.       
  34. }  

传统的timer的缺点:Timer对任务的调度是基于绝对时间的;所有的TimerTask只有一个线程TimerThread来执行,因此同一时刻只有一个TimerTask在执行;任何一个TimerTask的执行异常都会导致Timer终止所有任务;由于基于绝对时间并且是单线程执行,因此在多个任务调度时,长时间执行的任务被执行后有可能导致短时间任务快速在短时间内被执行多次或者干脆丢弃多个任务。

ScheduledExecutorService克服了上述缺点,例子如下:

  1. <span style="font-family:Verdana, Geneva, Arial, Helvetica, sans-serif;font-size:13px;">package com.jerry.concurrency;  
  2.   
  3.   
  4. import java.util.concurrent.Executors;  
  5. import java.util.concurrent.ScheduledExecutorService;  
  6. import java.util.concurrent.TimeUnit;  
  7.   
  8.   
  9.   
  10.   
  11. public class TestScheduledExecutorService{  
  12.     public static void main(String[] args) throws Exception{  
  13.         ScheduledExecutorService execService =   Executors.newScheduledThreadPool(3);  
  14.         // 5秒后开始执行 每个2秒执行一次,如果有的任务执行要花费比其周期更长的时间,则将推迟后续执行,但不会同时执行  
  15. //        每次相隔相同的时间执行任务,如果任务的执行时间比周期还长,那么下一个任务将立即执行  
  16.         execService.scheduleAtFixedRate(new Runnable() {  
  17.             public void run() {  
  18.                 System.out.println("任务:"+Thread.currentThread().getName()+" 执行了,时间为: "+System.currentTimeMillis());  
  19.                 try {  
  20.                     Thread.sleep(1000L);  
  21.                 } catch (Exception e) {  
  22.                     e.printStackTrace();  
  23.                 }  
  24.             }  
  25.         }, 52, TimeUnit.SECONDS);  
  26.         //5秒后开始执行 每个2秒执行一次,保证固定的延迟为2秒 下一个任务的开始时间与上一个任务的结束时间间隔相同  
  27.         execService.scheduleWithFixedDelay(new Runnable() {  
  28.             public void run() {  
  29.                 System.out.println("任务:"+Thread.currentThread().getName()+"执行了,时间为:"+System.currentTimeMillis());  
  30.                 try {  
  31.                     Thread.sleep(1000L);  
  32.                 } catch (Exception e) {  
  33.                     e.printStackTrace();  
  34.                 }  
  35.             }  
  36.         }, 52, TimeUnit.SECONDS);  
  37.         Thread.sleep(10000L);  
  38.         execService.shutdown();  
  39.     }  
  40. }  
  41. </span> 
目录
相关文章
|
Java 编译器 程序员
Checked Exception 和 Unchecked Exception 有什么区别?
Checked Exception 和 Unchecked Exception 有什么区别?
|
5月前
|
SQL 数据可视化 BI
Quick BI产品测评:从数据连接到智能分析的全流程体验
瓴羊智能商业分析-Quick BI是阿里云旗下的云端智能BI平台,连续五年入选Gartner ABI魔力象限。它提供从数据接入到决策的全链路服务,支持零代码操作、40+可视化组件与OLAP分析,实现跨终端呈现。其创新点包括云原生架构、企业级安全体系及智能决策引擎,适用于零售、金融等行业。评测中,通过免费试用与官方文档,体验了数据准备、仪表板搭建及智能小Q功能,发现智能化能力强大但部分文档需更新优化。
564 67
|
Kubernetes Java Linux
轻量级日志系统Loki原理简介和使用(3)
轻量级日志系统Loki原理简介和使用(3)
1117 0
轻量级日志系统Loki原理简介和使用(3)
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL版 GDN:实现真正的全球异地多活
【7月更文第31天】随着全球化业务的发展,企业需要确保其数据库能够在不同地理位置之间提供一致的服务质量和高可用性。阿里云PolarDB MySQL版的全球数据库网络(GDN)功能为此类需求提供了一个理想的解决方案。本文将深入探讨PolarDB MySQL版在GDN下的表现,并通过实际场景评测其异地多活能力。
467 3
|
网络协议 数据库连接 数据库
长连接与短连接的区别以及使用场景
这篇文章讨论了长连接与短连接的区别、各自的优缺点以及使用场景,指出短连接适用于浏览器访问服务器等场景,而长连接适用于操作频繁且连接数不多的情况,如数据库连接,选择长连接或短连接应根据实际需求和网络环境来决定。
长连接与短连接的区别以及使用场景
|
12月前
|
存储 NoSQL MongoDB
MongoDB使用方法
MongoDB使用方法
371 2
|
存储 SQL 关系型数据库
MySQL分库分表,何时分?怎么分?
MySQL分库分表,何时分?怎么分?
1358 0
MySQL分库分表,何时分?怎么分?
|
测试技术
如何高质量的做BUG分析
如何高质量的做BUG分析
390 0
|
供应链 安全 Java
安全同学讲Maven间接依赖场景的仲裁机制
去年的Log4j-core的安全问题,再次把供应链安全推向了高潮。在供应链安全的场景,蚂蚁集团在静态代码扫描平台-STC和资产威胁透视平台-哈勃这2款产品在联合合作下,优势互补,很好的解决了直接依赖和间接依赖的场景。但是由于STC是基于事前,受限于扫描效率存在遗漏的风险面,而哈勃又是基于事后,存在修复时间上的风险。基于此,笔者尝试寻找一种方式可以同时解决2款产品的短板。
安全同学讲Maven间接依赖场景的仲裁机制