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

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

   先前的两篇博文《任务调度(一)——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 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的代码。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jquery实现动态五角星评分

先上代码&#xff0c;最后附属上我的实现思路&#xff0c;新手做的bug多&#xff0c;大牛勿喷&#xff1a;请看代码&#xff1a; ☆☆☆☆☆<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-trans…

php中时间轴,PHP时间轴函数

26 04 2013PHP时间轴函数Yinchiang | 0我们会经常看见现在许多网站的留言或者评论的时间变得十分有趣&#xff0c;刚刚、3分钟前、1天前等等人性化的时间轴好吧&#xff0c;我承认这个函数是转载的&#xff0c;部分按照自己的需求修改了一点点。/*** 时间轴函数&#xff0c;单位…

开源Asp.Net Core小型社区系统

前言 盼星星盼月亮&#xff0c;Asp.Net Core终于发布啦&#xff01;&#xff01; Asp.Net发布时我还在上初中&#xff0c;没有赶上。但是Asp.Net Core我从beta版本便一直关注。最初项目名叫Asp.Net VNext&#xff0c;然后改名叫Asp.Net 5。最煎熬的是RC1发布后&#xff0c;官方…

Java多线程干货系列(1):Java多线程基础

转载自 Java多线程干货系列&#xff08;1&#xff09;&#xff1a;Java多线程基础前言 多线程并发编程是Java编程中重要的一块内容&#xff0c;也是面试重点覆盖区域&#xff0c;所以学好多线程并发编程对我们来说极其重要&#xff0c;下面跟我一起开启本次的学习之旅吧。 正文…

php accesscontrolalloworigin,设置Access-Control-Allow-Origin实现跨域访问

这篇文章主要介绍了Ajax 设置Access-Control-Allow-Origin实现跨域访问,非常不错&#xff0c;具有参考借鉴价值&#xff0c;需要的朋友可以参考下ajax跨域访问是一个老问题了&#xff0c;解决方法很多&#xff0c;比较常用的是JSONP方法&#xff0c;JSONP方法是一种非官方方法&…

.NET Core:面向未来的开源跨平台开发技术

作为一种全新的开源和跨平台的开发平台&#xff0c;.NET Core 历经两年多的开发&#xff0c;终于在于2016年6月27日针对所有主流服务器和桌面操作系统发布 1.0 RTM 版本。.NET Core 是一种通用开发平台&#xff0c;它包含了自动内存管理和现代化高级开发语言等重要特性&#xf…

Sublime Text 3 快捷键总结(拿走)

以下是个人总结不完全的快捷键总汇&#xff0c;祝愿各位顺利解放自己的鼠标。选择类CtrlD 选中光标所占的文本&#xff0c;继续操作则会选中下一个相同的文本。AltF3 选中文本按下快捷键&#xff0c;即可一次性选择全部的相同文本进行同时编辑。举个栗子&#xff1a;快速选中并…

Java多线程学习

转载自 Java多线程学习本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。在这之前&#xff0c;首先让我们来了解下在操作系统中进程和线程的区别&#xff1a;进程&#xff1a;每个进程都有独立的代码和数据空间&#…

php面试心得,php面试题的总结

这篇文章介绍的内容是关于php面试题的总结&#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下1. 什么事面向对象&#xff1f;主要特征是什么&#xff1f;面向对象是程序的一种设计方式&#xff0c;它利于提高程序的重用性&#xf…

展望C# 7

译者&#xff1a;雪落无痕 xdj 目前的 C# 编译器&#xff08;即 Roslyn&#xff09;于 2014 年 4 月开源。目前不仅是编译器在 GitHub 上开发&#xff1b;语言的设计也是进行公开的讨论。 这允许感兴趣的各方了解语言下一个版本的样子。这篇文章概述了当前在设计语言新特性时的…

Java 线程池详解及实例代码

转载自 Java 线程池详解及实例代码这篇文章主要介绍了Java 线程池的相关资料,并符实例代码&#xff0c;帮助大家学习参考&#xff0c;需要的朋友可以参考下线程池的技术背景 在面向对象编程中&#xff0c;创建和销毁对象是很费时间的&#xff0c;因为创建一个对象要获取内存资…

jQuery最简单的留言功能^-^

先上代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml" xml:lang"en"> <h…

rocketmq java home,rocketmq 安装与配置以及遇到的问题

不废话&#xff0c;搞起双M 模式环境1&#xff0c;java-1.8这里有个问题&#xff0c;centos 安装yum install java-1.8 是只是安装的java 运行环境jre&#xff0c;还缺少开发包所以在编译的时候会有问题&#xff0c;使用yum install yum install java-1.8.0-openjdk-devel* 这…

聊聊并发(八)——Fork/Join框架介绍

转载自 聊聊并发&#xff08;八&#xff09;——Fork/Join框架介绍1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架&#xff0c; 是一个把大任务分割成若干个小任务&#xff0c;最终汇总每个小任务结果后得到大任务结果的框架。 我们再通过F…

Mads Torgersen介绍C# 7及后续版本新特性

在QCon纽约2016大会上&#xff0c;C#项目经理Mads Torgersen介绍了即将到来的C# 7。他还简单地阐述了C#的演化过程&#xff0c;并展示了部分正在开发的未来版本特性。 近年来&#xff0c;云和分布式系统的出现使开发人员面临着新的挑战。开发人员需要进步&#xff0c;语言也要随…

Java的不同进制输出,[DanoR][Java小码][进制转换::将double转换为不同进制后用String输出]...

功能简述进制转换输入: 一个数(double),目标进制(int)和小数的保留位数(int)输出: 相应进制的表示方式(String)参数说明double number; //将要被转换的数int ary; //目标进制int accuracy; //指定小数保留的位数特性支持小数转换例0: (5.20, 8, 4) --> 5.146314631463146315…

小菜:Java异常处理的10个最佳实践

转载自 小菜&#xff1a;Java异常处理的10个最佳实践异常处理在编写健壮的 Java 应用中扮演着非常重要的角色。异常处理并不是功能性需求&#xff0c;它需要优雅地处理任何错误情况&#xff0c;比如资源不可用、非法的输入、null 输入等等。Java 提供很多异常处理特性&#x…

JavaScript的正则表达式实现邮箱校验

说到html5&#xff0c;在说邮箱校验&#xff0c;聪明的人已经想到了直接写个 电子邮箱&#xff1a;<input type"email" name"email">这样不就是自动校验邮箱了么。。。。 不错&#xff0c;这样也可以&#xff0c;但是我要说的是&#xff1a;在没有…

微软说它深爱着Linux,现在它用行动证明了

6.27 清晨&#xff0c;微软在Red Hat DevNation大会上正式发布了.NET Core以及ASP.NET Core 1.0&#xff0c;并提供了下载&#xff0c;其不仅能在Windows操作系统上运行&#xff0c;还能在Linux和Mac OS X操作系统上运行&#xff0c;这意味着开发者不仅能使用它来建立自己的应用…

php file_put_contents(quot;,php file_put_contents函数怎么用?

file_put_contents()是PHP中的是一个内置函数&#xff0c;用于将字符串写入文件。用户想要写入的文件的路径和必须写入的数据作为参数传递给函数&#xff0c;并返回成功时写入文件的字节数&#xff0c;失败时返回FALSE。php file_put_contents()函数怎么用&#xff1f;php file…