先前的两篇博文《任务调度(一)——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. 玩一把redis源码(一):为redis添加自己的列表类型

    2019年第一篇文档,为2019年做个良好的开端,本文档通过step by step的方式向读者展示如何为redis添加一个数据类型,阅读本文档后读者对redis源码的执行逻辑会有比较清晰的认识,并且 ...

  2. js 判断访问终端类型

    // 判断访问终端类型 var browser = { versions: function() { var u = navigator.userAgent, app = navigator.appV ...

  3. html页面比较长,如何用js实现网页一打开显示在网页的中部?

    加入js代码 <style type="text/css"> body { height: 2000px; } </style> <script ty ...

  4. 安装exe4j出现jre不匹配问题

    在安装exe4j 客户端,提示如下错误: 提示的错误信息大意如下:install4j安装时,在本系统中没有找到JRE(JavaRuntime Environment)(版本要求:最低1.5,最高1.6 ...

  5. Python飞机大战实例有感——pygame如何实现“切歌”以及多曲重奏?

    目录 pygame如何实现"切歌"以及多曲重奏? 一.pygame实现切歌 初始化路径 尝试一 尝试二 尝试三 成功 总结 二.如何在python多线程顺序执行的情况下实现音乐和音 ...

  6. CSS 全局样式

    设置全局 CSS 样式:基本的 HTML 元素均可以通过 class 设置样式并得到增强效果:还有先进的栅格系统.

  7. PHP:Mysql 基础类

    文章来源:http://www.cnblogs.com/hello-tl/p/7592547.html <?php /** * __construct($Mysql_config) 构造函数 $ ...

  8. Poj 2187 旋转卡壳

    Poj 2187 旋转卡壳求解 传送门 旋转卡壳,是利用凸包性质来求解凸包最长点对的线性算法,我们逐渐改变每一次方向,然后枚举出这个方向上的踵点对(最远点对),类似于用游标卡尺卡着凸包旋转一周,答案就 ...

  9. 【03】emmet系列之CSS语法

    [01]emmet系列之基础介绍 [02]emmet系列之HTML语法 [03]emmet系列之CSS语法 [04]emmet系列之编辑器 [05]emmet系列之各种缩写   单位: 有几个常用值别 ...

  10. Notepad++ 连接远程 FTP 进行文件编辑

    一.下载安装 Notepad++ 1.下载 Notepad++ : https://pan.baidu.com/s/1o7VrS4y 密码 : ck8a 2.安装 Notepad++ 2.1.勾选所有 ...