ScheduledExecutorService的使用

http://407827531.iteye.com/blog/1329597

ScheduledExecutorService接口

在ExecutorService的基础上,ScheduledExecutorService提供了按时间安排执行任务的功能,它提供的方法主要有:

  • schedule(task,initDelay):安排所提交的Callable或Runnable任务在initDelay指定的时间后执行。
  • scheduleAtFixedRate():安排所提交的Runnable任务按指定的间隔重复执行
  • scheduleWithFixedDelay():安排所提交的Runnable任务在每次执行完后,等待delay所指定的时间后重复执行。

    代码:ScheduleExecutorService的例子
  • import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.ScheduledFuture;
    import java.util.concurrent.TimeUnit;
    public class ScheduledExecutorServiceTest
    {
           public static void main(String[] args) throws InterruptedException,ExecutionException
           {
                  //*1
                   ScheduledExecutorService service=Executors.newScheduledThreadPool(2);
                   //*2
                   Runnable task1=new Runnable()
                   {
                        public void run()
                        {
                           System.out.println("Taskrepeating.");
                        }
                   };
                   //*3
                   final ScheduledFuture future1=service.scheduleAtFixedRate(task1,0,1,TimeUnit.SECONDS);
                   //*4
                   ScheduledFuture future2=service.schedule(new Callable()
                {
                        public String call()
                        {
                                future1.cancel(true);
                                return "taskcancelled!";
                        }
                   },10,TimeUnit.SECONDS);
                   System.out.println(future2.get());
         //*5
         service.shutdown();
       }
    }
    

      

    • 这个例子有两个任务,第一个任务每隔一秒打印一句“Taskrepeating”,第二个任务在5秒钟后取消第一个任务。

      *1:初始化一个ScheduledExecutorService对象,这个对象的线程池大小为2。

      *2:用内函数的方式定义了一个Runnable任务。

      *3:调用所定义的ScheduledExecutorService对象来执行任务,任务每秒执行一次。能重复执行的任务一定是 Runnable类型。注意我们可以用TimeUnit来制定时间单位,这也是Java5.0里新的特征,5.0以前的记时单位是微秒,现在可精确到奈秒。

      *4:调用ScheduledExecutorService对象来执行第二个任务,第二个任务所作的就是在5秒钟后取消第一个任务。

      *5:关闭服务。

时间: 2024-10-15 11:25:17

ScheduledExecutorService的使用的相关文章

ScheduledExecutorService

项目中用到了ScheduledExecutorService这里简单写了个demo留以后复习 job工作 package org.ScheduledExecutorService; import java.text.SimpleDateFormat; import java.util.Date; public class RunnableJob implements Runnable{ private static SimpleDateFormat sdf = new SimpleDateFor

Java再学习——Executor,ExecutorService,ScheduledExecutorService与Executors

1,Executor.ExecutorService和ScheduledExecutorService,它们都是接口,它们的关系是ScheduledExecutorService继承ExecutorService而ExecutorService 又继承Executor. 这些只要点开源码就能看得到. 2,对于Executor接口,它只有一个方法void execute(Runnable command);而其后的ExecutorService和ScheduledExecutorService就各

关于ScheduledExecutorService执行一段时间之后就不执行的问题

问题背景 最近写了个程序,程序中使用到了ScheduledExecutorService的scheduleAtFixedRate方法,用于定时执行任务,但是发现程序运行一段时间之后定时任务不执行了,查看日志和perfcounter都没有看到任何异常,比较郁闷.最后看了一下JDK的源码,在源码的Java doc中的发现了如下一句话: If any execution of the task encounters an exception, subsequent executions are sup

Timer与ScheduledExecutorService间的抉择

java.util.Timer计时器有管理任务延迟执行("如1000ms后执行任务")以及周期性执行("如每500ms执行一次该任务").但是,Timer存在一些缺陷,因此你应该考虑使用ScheduledThreadPoolExecutor作为代替品,Timer对调度的支持是基于绝对时间,而不是相对时间的,由此任务对系统时钟的改变是敏感的;ScheduledThreadExecutor只支持相对时间. Timer的另一个问题在于,如果TimerTask抛出未检查的异

使用ScheduledExecutorService实现Timer

大家都说Timer不太好用,经常会遇到:如果前边的一个任务比较慢,超出了period,此时timer的下一次轮询也不会延迟. 同事说ScheduleExecutorService可以避免该问题,我写个例子测试下: package com.dx.testparallel; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.conc

任务调度(三)——Timer的替代品ScheduledExecutorService简介

先前的两篇博文<任务调度(一)--jdk自带的Timer>和<任务调度(二)--jdk自带的Timer 动态修改任务执行计划>中,简单介绍了一下Timer,可以实现几本的功能,但是在多线程方面却略显不足. 根据Timer源码,可以看到Timer是单线程的.所以task都是串行执行.假如其中一个task执行需要很长的时间,那其他的task只能干巴巴的等着.怎么办! 现在就遇到了这样的问题.总不能因为这个小小的问题就去换别的任务调度框架吧,还是想用最简单的方案去解决一下.所以Sched

任务调度(三)——Timer的替代品ScheduledExecutorService简单介绍

先前的两篇博文<任务调度(一)--jdk自带的Timer>和<任务调度(二)--jdk自带的Timer 动态改动任务运行计划>中,简介了一下Timer,能够实现几本的功能.可是在多线程方面却略显不足. 依据Timer源代码,能够看到Timer是单线程的. 所以task都是串行运行. 假如当中一个task运行须要非常长的时间,那其它的task仅仅能干巴巴的等着.怎么办! 如今就遇到了这种问题. 总不能由于这个小小的问题就去换别的任务调度框架吧,还是想用最简单的方案去解决一下.所以Sc

Java ScheduledExecutorService源码分析

Java 定时任务可以用Timer + TimerTask来做,或者使用ScheduledExecutorService,使用ScheduledExecutorService有两个好处: 1. 如果任务执行时间过长,TimerTask会出现延迟执行的情况.比如,第一任务在1000ms执行了4000ms,第二个任务定时在2000ms开始执行.这里由于第一个任务要执行4000,所以第二个任务实际在5000ms开始执行.这是由于Timer是单线程,且顺序执行提交的任务 2. 如果执行任务抛出异常,Ti

Java 并发专题 : Timer的缺陷 用ScheduledExecutorService替代

继续并发,上篇博客对于ScheduledThreadPoolExecutor没有进行介绍,说过会和Timer一直单独写一篇Blog. 1.Timer管理延时任务的缺陷 a.以前在项目中也经常使用定时器,比如每隔一段时间清理项目中的一些垃圾文件,每个一段时间进行数据清洗:然而Timer是存在一些缺陷的,因为Timer在执行定时任务时只会创建一个线程,所以如果存在多个任务,且任务时间过长,超过了两个任务的间隔时间,会发生一些缺陷:下面看例子: Timer的源码: [java] view plainc