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

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

所以task都是串行运行。

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

如今就遇到了这种问题。

总不能由于这个小小的问题就去换别的任务调度框架吧,还是想用最简单的方案去解决一下。所以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 blocke.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. 任务调度(三)——Timer的替代品ScheduledExecutorService简介

    转载自  任务调度(三)--Timer的替代品ScheduledExecutorService简介 先前的两篇博文<任务调度(一)--jdk自带的Timer>和<任务调度(二)--j ...

  2. Java定时任务调度实战(2)Quart框架的简单介绍

    一.前言 在之前的文章<Java定时任务调度(1)TimerTask原理与实战>中已经介绍了一种实现定时任务调度的方法--Java原生提供的 TimerTask,这个工具适用于一些简单的业 ...

  3. 三种联邦学习的简单介绍

    (一)横向联邦学习 1.定义 横向联邦学习也称为按样本划分的联邦学习,可以应用于联邦学习的 各个参与方的数据集有相同的特征空间和不同的样本空间的场景. 2.横向联邦学习架构 常用的两个系统架构为:客户 ...

  4. 遍历Arraylist的三种方法及优缺点简单介绍

    集合ArrayList是接口List的一种子类,它的特点是:存储的元素是有序的.底层的数据结构是数组.查询快,增删慢.在众多集合中ArrayList的遍历又是比较特殊的,下面就写一下它的三种遍历方式, ...

  5. 简单介绍一下关系数据库三范式?

    简单介绍一下关系数据库三范式? 一.简单介绍一下关系数据库三范式? 二.事务四个基本特征或 ACID 特性. 一.简单介绍一下关系数据库三范式?   范式就是规范,就是关系型数据库在设计表时,要遵循的 ...

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

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

  7. Java中的GC简单介绍

    文章目录 一.GC是什么? 二.为什么要GC? 三.怎么GC? 一.GC是什么? GC英文全称为Garbage Collection,即垃圾回收. Java中的GC就是对内存的GC. Java的内存管 ...

  8. LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍

    LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍 LVS (Linux Virtual Server) LVS(Linux Virtual Server)其实就是 ...

  9. php fpm 三个模式_php-fpm运行原理和模式的简单介绍

    本篇文章给大家带来的内容是关于php-fpm运行原理和模式的简单介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 运行原理: cgi初始化阶段:分别调用fcgi_init()和 s ...

最新文章

  1. 从Nginx源码谈大小写字符转化的最高效代码以及ASCII码表的科学
  2. 绝对经典的滑轮新闻显示(javascript+css)实现
  3. 解决linux ssh登陆缓慢问题
  4. Cognos 云最佳实践: 调整架构提供性能和可伸缩性
  5. java批量删除接口怎么定义_教你在Java接口中定义方法
  6. 嵌入式linux的学习笔记-共享内存(六)
  7. dj电商-需求分析-购物车模块与订单模块
  8. HTTP协议中GET和POST方法的区别
  9. JAVA-1011. A+B和C (15)
  10. 企业搜索引擎(Enterprise Search Engine)的2007中重要的功能
  11. 指针08:指针配合数组和函数
  12. tomcat端口修改以及jvm启动参数设置
  13. 如何在 Linux 终端中一次运行多个 Linux 命令(初学者教程)
  14. 双目估计方法_双目深度估计中的自监督学习概览
  15. 网络工程师考试第一节计算机硬件基础
  16. 易语言查询Windows API之网络函数消息函数
  17. ie-此更新不适应于此电脑
  18. 启动cartographer_ros进行仿真错误process has died exit code -11
  19. 五大地形等高线特征_七年级所有知识点
  20. 搜狐html5,手机搜狐率先发力Html5技术

热门文章

  1. python中的scipy基础知识_python3 scipy 入门
  2. Linux和qt电子横幅,【Qt】 自定义组件_滚动横幅弹窗对话框字体图标等
  3. 贷款利息及公积金知识点
  4. python导入模块报错“ImportError: No module namedXXX”
  5. M进制转N进制(C++)
  6. django-admin.py startproject HelloWorld创建文件提示invalid syntax
  7. dotween unity 延时_3D俯视角射击——用Unity还原东方弹幕(上)
  8. matlab中cuda编程中分配grid和block dimension的时候的注意事项
  9. lesson 7 strategies for efficient CUDA programming
  10. 19复变函数的积分(五)