前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ScheduledExecutorService和timer的异同

ScheduledExecutorService和timer的异同

作者头像
xiangzhihong
发布2018-01-30 11:03:25
9780
发布2018-01-30 11:03:25
举报
文章被收录于专栏:向治洪

先来个传统的Timer的例子:

代码语言:java
复制
package com.jerry.concurrency;  
 
import java.text.ParseException;  
import java.text.SimpleDateFormat;  
import java.util.Date;  
import java.util.Timer;  
import java.util.TimerTask;  
 
public class TraditionalTask {  
 
 
 public static void main(String[] args) throws ParseException {  
        Timer myTimer = new Timer();  
        myTimer.schedule(new Worker(), 1000);//1秒后执行 
//      2012-02-28 09:58:00执行 
        myTimer.schedule(new Worker(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2012-02-28 09:58:00"));  
        myTimer.schedule(new Worker(), 5000,1000);//5秒后执行 每一秒执行一次 
//      2012-02-28 09:58:00执行一次 以后每秒执行一次,如果设定的时间点在当前时间之前,任务会被马上执行,然后开始按照设定的周期定时执行任务 
        myTimer.schedule(new Worker(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2012-02-28 09:58:00"),1000);  
        myTimer.scheduleAtFixedRate(new Worker(), 5000,1000);//5秒后执行 每一秒执行一次 如果该任务因为某些原因(例如垃圾收集)而延迟执行,那么接下来的任务会尽可能的快速执行,以赶上特定的时间点 
        myTimer.scheduleAtFixedRate(new Worker(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2012-02-28 09:58:00"),1000);//和上个类似 
    }  
}  
 
 
class Worker extends TimerTask {  
 
 @Override 
 public void run() {  
 
        System.out.println("我被执行了!"+"时间是:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));  
    }  
 
}  

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

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

代码语言:java
复制
<span style="font-family:Verdana, Geneva, Arial, Helvetica, sans-serif;font-size:13px;">package com.jerry.concurrency;  
 
 
import java.util.concurrent.Executors;  
import java.util.concurrent.ScheduledExecutorService;  
import java.util.concurrent.TimeUnit;  
 
 
 
 
public class TestScheduledExecutorService{  
 public static void main(String[] args) throws Exception{  
        ScheduledExecutorService execService =   Executors.newScheduledThreadPool(3);  
 // 5秒后开始执行 每个2秒执行一次,如果有的任务执行要花费比其周期更长的时间,则将推迟后续执行,但不会同时执行 
//        每次相隔相同的时间执行任务,如果任务的执行时间比周期还长,那么下一个任务将立即执行 
        execService.scheduleAtFixedRate(new Runnable() {  
 public void run() {  
                System.out.println("任务:"+Thread.currentThread().getName()+" 执行了,时间为: "+System.currentTimeMillis());  
 try {  
                    Thread.sleep(1000L);  
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
            }  
        }, 5, 2, TimeUnit.SECONDS);  
 //5秒后开始执行 每个2秒执行一次,保证固定的延迟为2秒 下一个任务的开始时间与上一个任务的结束时间间隔相同 
        execService.scheduleWithFixedDelay(new Runnable() {  
 public void run() {  
                System.out.println("任务:"+Thread.currentThread().getName()+"执行了,时间为:"+System.currentTimeMillis());  
 try {  
                    Thread.sleep(1000L);  
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
            }  
        }, 5, 2, TimeUnit.SECONDS);  
        Thread.sleep(10000L);  
        execService.shutdown();  
    }  
}  
</span>  
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-08-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档