ScheduledThreadPoolExecutor应用

来源:互联网 发布:手机表格制作软件 编辑:程序博客网 时间:2024/05/17 09:14

在JDK1.5之前,我们关于定时/周期操作都是通过Timer来实现的。但是Timer有以下几种危险[JCIP]

a. Timer是基于绝对时间的。容易受系统时钟的影响。
b. Timer只新建了一个线程来执行所有的TimeTask。所有TimeTask可能会相关影响
c. Timer不会捕获TimerTask的异常,只是简单地停止。这样势必会影响其他TimeTask的执行。

 如果你是使用JDK1.5以上版本,建议用ScheduledThreadPoolExecutor代替Timer。它基本上解决了上述问题:


private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
注释:此处的checker是一个线程,1表示启动延迟1个单位开始执行这个线程,然后每隔5分钟执行一次,单位是分钟类似于
 final ScheduledFuture<?> checkerHandle = scheduler.scheduleAtFixedRate(checker, 1, 5, TimeUnit.MINUTES);

方法:
//使用给定核心池大小"这里为1个,池中所保存的线程数“创建一个新 ScheduledThreadPoolExecutor。
ScheduledThreadPoolExecutor exec=new ScheduledThreadPoolExecutor(1);           
        exec.scheduleAtFixedRate(new Runnable(){//每隔一段时间就触发异常 
            @Override 
            public void run() { 
                throw new RuntimeException(); 
            }}, 1000, 5000, TimeUnit.MILLISECONDS); 


 ScheduledThreadPoolExecutor除了具有ThreadPoolExecutor的所有功能外,还可以延迟执行任务或者周期性的执行某个任务。scheduleWithFixedDelay和scheduleAtFixedRate就是用来完成这个功能的。
scheduleAtFixedRate有两个时间参数,initialDelay和period,对应该方法的两个主要功能,即延迟运行任务和周期性执行任务。如果command方法的执行时间是10秒,那么执行command的周期其实是20秒,即scheduleAtFixedRate这个方法要等一个完整的command方法执行完成后才继续周期性地执行command方法,其实这样的设计也是符合常理的。

// 在指定的延迟后以固定速率执行(类似Timer.scheduleAtFixedRate())
ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)

// 在指定的延迟后以固定间隔执行(类似Timer.schedule())
ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)

 

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
          创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay 后开始执行,然后在 initialDelay+period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。

原创粉丝点击