任务调度(三)——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的代码。

时间: 2024-10-29 04:58:43

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

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

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

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

http://www.cnblogs.com/tornadomeet/archive/2013/05/05/3061457.html 前言: 本节主要是来简单介绍下stacked CNN(深度卷积网络),起源于本人在构建SAE网络时的一点困惑:见Deep learning:三十六(关于构建深度卷积SAE网络的一点困惑).因为有时候针对大图片进行recognition时,需要用到无监督学习的方法去pre-training(预训练)stacked CNN的每层网络,然后用BP算法对整个网络进行fin

js按钮确认删除提示以及js的三种弹出框简单介绍

js按钮确认删除提示 第一种方法: html代码: 1 <a href="" οnclick="javascript:return del();">删除</a> js代码: 1 function del() { 2 var msg = "您真的确定要删除吗?\n\n请确认!"; 3 if (confirm(msg)==true){ 4 return true; 5 }else{ 6 return false; 7 } 8

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

一.概述 近年来,大数据技术如火如荼,怎样存储海量数据也成了当今的热点和难点问题,而HDFS分布式文件系统作为Hadoop项目的分布式存储基础,也为HBASE提供数据持久化功能,它在大数据项目中有很广泛的应用. Hadoop分布式文件系统(Hadoop Distributed File System.HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.HDFS是Hadoop项目的核心子项目,是一种具有高容错性.高可靠性.高可扩展性.高吞吐量等特征的分布

linux设备驱动第三篇:写一个简单的字符设备驱动

在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存. 下面就开始学习如何写一个简单的字符设备驱动.首先我们来分解一下字符设备驱动都有那些结构或者方法组成,也就是说实现一个可以使用的字符设备驱动我们必须做些什么工作. 1.主设备号和次设备号 对于字符设备的访问是通过文件系统中的设备名称进行的.他们通常位于/dev目录下.如下: [plain] vie

linux设备驱动第三篇:如何实现简单的字符设备驱动

在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存. 下面就开始学习如何写一个简单的字符设备驱动.首先我们来分解一下字符设备驱动 都有那些结构或者方法组成,也就是说实现一个可以使用的字符设备驱动我们必须做些什么工作. 1.主设备号和次设备号 对于字符设备的访问是通过文件系统中的设备名称进行的.他们通常位于/dev目录下.如下: [email pro

【转载】JMeter学习(一)工具简单介绍

JMeter学习(一)工具简单介绍 一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态和动态资源的性能,例如:静态文件,Java Servlet,CGI Scripts,Java Object,数据库和FTP服务器等等.JMeter可用于模拟大量负载来测试一台服务器,网络或者对象的健壮性或者分析不同负载下的整体性能.     同时,JMeter可以帮助你对你的应用程序进行回归测试.

内核调试神器SystemTap — 简单介绍与使用(一)

a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 简单介绍 SystemTap是我眼下所知的最强大的内核调试工具,有些家伙甚至说它无所不能:) (1) 发展历程 Debuted in 2005 in Red Hat Enterprise Linux 4 Update 2 as a technology preview. After four years in development, System 1.0 was rel

JAVA定时任务调度之Timer入门详解(二)

在上篇的JAVA定时任务调度之Timer入门详解(一)文章中,主要介绍了下Timer,接下来我们一起来看看Timer的一些常用方法. 1.schedule()的4种用法. 第一种:schedule(TimerTask task, Date time); task:安排的任务,time:具体执行时间.这个函数表达的意义是:在时间等于或超过time的时候执行且执行一次task.测试内容如下 MyTimerTask.java的代码跟第一篇一样,MyTimer.java的部分代码截图如下: 运行后,控制