先前的两篇博文《任务调度(一)——jdk自带的Timer》和《任务调度(二)——jdk自带的Timer
动态改动任务运行计划
》中,简介了一下Timer,能够实现几本的功能。可是在多线程方面却略显不足。

依据Timer源代码,能够看到Timer是单线程的。

所以task都是串行运行。

假如当中一个task运行须要非常长的时间,那其它的task仅仅能干巴巴的等着。怎么办!

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="500" height="250" alt="">

如今就遇到了这种问题。

总不能由于这个小小的问题就去换别的任务调度框架吧,还是想用最简单的方案去解决一下。所以ScheduledExecutorService就被我选中了。这个是怎么找到的?1.网上搜,2.好好的看Timer类的凝视:

翻译一下:java5.0引入了java.util.concurrent包。当中java.util.concurrent.scheduledthreadpoolexecutor就是在并发有用工具当中之中的一个。scheduledthreadpoolexecutor是一个能够反复运行任务的线程池,而且能够指定任务的间隔和延迟时间。它作为比Timer/TimerTask更加通用的替代品。由于它同意多个服务线程,接受不同的时间单位,且不须要继承TimeTask(只须要实现Runnable接口)。配置ScheduledThreadPoolExecutor为单线程,则与使用Timer等效。

ScheduledThreadPoolExecutor实现了ScheduledExecutorService接口。所以标题中使用了接口的名字。

ScheduledExecutorService提供了4个方法:

当中第二个方法比較特殊一点,第一个參数是Callable。别的都是Runnable,二者的差别不再这篇博文的讨论范围之内。就此略过。说一些其它三个方法。

schedule()方法第一个參数是任务实例,第二个參数是延迟时间,第三个是时间单元。

比方调用例如以下:

	ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);
pool.schedule(task1, 5, TimeUnit.SECONDS);//延迟5s后,运行且仅仅运行一次task1

scheduleAtFixedRate()和scheduleWithFixedDelay方法參数是一样的。

第一个參数是任务实例,第二个參数是延迟时间。第三个是间隔时间,第四个是时间单元。

这两个方法的不同之处在方法名也能看得出来:scheduleAtFixedRate方法是依照固定频率去运行任务的。而scheduleWithFixedDelay方法则是依照固定的延迟去运行任务。

/**
* task1
*
* @author arron
* @date 2015年8月5日 下午2:08:34
* @version 1.0
*/
public class Task1 implements Runnable{ @SuppressWarnings("deprecation")
public void run() {
System.out.println("----task1 start--------"+new Date().toLocaleString());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("----3s later, task1 end--------"+new Date().toLocaleString());
} }

測试scheduleAtFixedRate方法:

	public static void main(String[] args) {

		ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);

		Task1 t1 = new Task1();
//马上运行t1,3s后任务结束,再等待2s(间隔时间-消耗时间),假设有空余线程时,再次运行该任务
pool.scheduleAtFixedRate(t1, 0, 5, TimeUnit.SECONDS); }

运行结果如图:

task1第二次运行的前提是,当前有空余的线程。

运行的開始时间则是上一次结束时间+(间隔时间-任务消耗的时间)。

增加这个差值小于0。即间隔时间小于任务消耗的时间,那就不会再等待,会马上运行(当然得满足前提)。

測试scheduleAtFixedRate方法:

	public static void main(String[] args) {

		ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);

		Task1 t1 = new Task1();
//马上运行t1,3s后任务结束。再等待5s(间隔时间-消耗时间)。假设有空余线程时,再次运行该任务
pool.scheduleWithFixedDelay(t1, 0, 5, TimeUnit.SECONDS); }

运行结果如图:

就简介到这里,下篇将会分享替换Timer的代码。

任务调度(三)——Timer的替代品ScheduledExecutorService简单介绍的更多相关文章

  1. Deep learning:三十八(Stacked CNN简单介绍)

    http://www.cnblogs.com/tornadomeet/archive/2013/05/05/3061457.html 前言: 本节主要是来简单介绍下stacked CNN(深度卷积网络 ...

  2. 5、Cocos2dx 3.0游戏开发找小三之測试例子简单介绍及小结

    重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27186557 測试例子简单介绍 Cocos2d-x ...

  3. java任务调度之Timer定时器

    定时器相信大家都不陌生,平时使用定时器就像使用闹钟一样,我们可以在固定的时间做某件事,也可以在固定的时间段重复做某件事,今天就来分析一下java中自带的定时任务器Timer. 一.Timer基本使用 ...

  4. Hadoop源码学习笔记之NameNode启动场景流程一:源码环境搭建和项目模块及NameNode结构简单介绍

    最近在跟着一个大佬学习Hadoop底层源码及架构等知识点,觉得有必要记录下来这个学习过程.想到了这个废弃已久的blog账号,决定重新开始更新. 主要分以下几步来进行源码学习: 一.搭建源码阅读环境二. ...

  5. HDFS简单介绍及用C语言訪问HDFS接口操作实践

    一.概述 近年来,大数据技术如火如荼,怎样存储海量数据也成了当今的热点和难点问题,而HDFS分布式文件系统作为Hadoop项目的分布式存储基础,也为HBASE提供数据持久化功能,它在大数据项目中有很广 ...

  6. Android Fragment(三)ListFragment简单介绍以及Fragment之间通信

    一.Fragment通信简单介绍:Fragments之间是不能够直接通信的,他们之间的通信是通过Activity这个中间件来通信的, 为了让Fragment跟它的Activity通信,我们可以在Fra ...

  7. 2、Cocos2dx 3.0游戏开发找小三之引擎简单介绍

    尊重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27094663 引擎简单介绍 Cocos2d-x 的 ...

  8. 【转载】salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)

    salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)   salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesfo ...

  9. 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...

随机推荐

  1. day25-1 网络架构与互联网组成

    目录 网络架构 单机架构 CS架构 数据放在服务端和客户端的利与弊 BS架构 互联网和互联网的组成 互联网的硬件组成 互联网的软件组成 网络架构 单机架构 应用领域: 单机游戏 CS架构 基于网络,应 ...

  2. Log.d 日志调试查看(所有平台)

    https://www.cnblogs.com/onechen/p/6436748.html http://docwiki.embarcadero.com/Libraries/Berlin/en/FM ...

  3. python3+beautifulSoup4.6抓取某网站小说(二)基础功能设计

    本章学习内容:1.网页编码还原读取2.功能设计 stuep1:网页编码还原读取 本次抓取对象: http://www.cuiweijuxs.com/jingpinxiaoshuo/ 按照第一篇的代码来 ...

  4. Android-ViewPagerIndicator框架使用——CirclePageIndicator

    前言:Circle适用于应用新功能的展示页和商品的多张图片的展示功能. 1.定义布局文件:SampleCirclesDefault中添加了一个布局:simple_circles. 布局中定义一个Lin ...

  5. js 页面图片等元素在普通元素中滚动动态加载技术

    /*! * 2012-01-13 v1.1 偏移值计算修改 position → offset * 2012-09-25 v1.2 增加滚动容器参数, 回调参数 * 2015-11-17 v1.3 只 ...

  6. 笔试算法题(45):简介 - AC自动机(Aho-Corasick Automation)

    议题:AC自动机(Aho-Corasick Automation) 分析: 此算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一:一个常见的例子就是给定N个单词,给定包含M个字符的文章,要求 ...

  7. Linux下启动tomcat报java.lang.OutOfMemoryError: PermGen space

    一.错误信息 java.lang.reflect.InvocationTargetException    at sun.reflect.NativeMethodAccessorImpl.invoke ...

  8. uva 10596 - Morning Walk

    Problem H Morning Walk Time Limit 3 Seconds Kamal is a Motashota guy. He has got a new job in Chitta ...

  9. Matlab学习笔记(五)

    三.矩阵运算 (一)矩阵函数和特殊矩阵 常见的矩阵处理函数 表3-1    常见的矩阵函数 函数 说明 /或\ 矩阵除法中的左除或右除,可以用于求解线性方程组 accumarray(ind,val) ...

  10. 笔记——collections模块

    collections模块 collections模块在内置数据类型(dict.list.set.tuple)的基础上,还提供了几个额外的数据类型:ChainMap.Counter.deque.def ...