`

ScheduledExecutorService 源码分析

阅读更多
public interface ScheduledExecutorService extends ExecutorService {

	// 创建在指定延迟后执行且只运行一次的的任务
	public ScheduledFuture<?> schedule(Runnable command,
				       long delay, TimeUnit unit);

	// 同上,这里是callable对象
	public <V> ScheduledFuture<V> schedule(Callable<V> callable,
					   long delay, TimeUnit unit);

	// 创建在初始延迟后执行并周期性调用的的任务
	// 如果执行任务时间大于周期,则下一个任务开始时间会推迟,不会存在并行执行。
	public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
						  long initialDelay,
						  long period,
						  TimeUnit unit);

	// 创建在初始延迟后执行并周期性调用的的任务。
	// 和上面的区别:这里的delay是前一个任务执行完成后,和下一个任务开始时间的间隔。
	public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
						     long initialDelay,
						     long delay,
						     TimeUnit unit);

}



测试:
public class ScheduledExecutorServiceTest {

	private static final int POOL_SIZE = 4;
	
	private static ScheduledExecutorService ses = null;
	
	@org.junit.Before
	public void setUp() {
		ses = Executors.newScheduledThreadPool(POOL_SIZE);
	}
	
	@After
	public void tearDown() {
		ses.shutdown();
	}
	
    @Test
    public void scheduled() throws ExecutionException, InterruptedException {
        MyCall task = new MyCall();
        System.out.println(System.currentTimeMillis() + " : scheduled...");
        // 延时100+1000毫秒打印
        ScheduledFuture<String> future = ses.schedule(task, 100, TimeUnit.MILLISECONDS);
        String result = future.get();
        System.out.println(System.currentTimeMillis() + " result: " + result);
    }

    @Test
    public void scheduledAtFixedRateTest() throws InterruptedException {
        MyCmd myCmd = new MyCmd();
        System.out.println(System.currentTimeMillis() + " : scheduledAtFixedRate...");
        // 首次延迟100毫秒,然后每隔max(2000,3000)毫秒打印
        ses.scheduleAtFixedRate(myCmd, 100, 2000, TimeUnit.MILLISECONDS);
        TimeUnit.MILLISECONDS.sleep(60000);
    }

    @Test
    public void scheduledAfFixedDelayTest() throws InterruptedException {
        MyCmd myCmd = new MyCmd();
        System.out.println(System.currentTimeMillis() + " : scheduledAfFixedDelay...");
        // 首次延迟100毫秒,然后每隔5000毫秒打印
        ses.scheduleWithFixedDelay(myCmd, 100, 2000, TimeUnit.MILLISECONDS);
        TimeUnit.MILLISECONDS.sleep(60000);
    }

    static class MyCall implements Callable<String> {

        @Override
        public String call() throws Exception {
            TimeUnit.MILLISECONDS.sleep(1000);
            return "MyTask is done";
        }
    }

    static class MyCmd implements Runnable {
        @Override
        public void run() {
            try {
                TimeUnit.MILLISECONDS.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(System.currentTimeMillis() + " : MyCmd is done!");
        }
    }
}


scheduled输出 (延时100+1000毫秒打印)
1505538732156 : scheduled...
1505538733257 result : MyTask is done

scheduledAtFixedRateTest输出 (间隔3000毫秒=max(2000, 3000)):
1505538684893 :scheduledAtFixedRate...
1505538687996 : MyCmd is done!
1505538690997 : MyCmd is done!

scheduledAtFixedDelayTest输出 (间隔5000毫秒=2000+3000):
1505536678015 :scheduledAfFixedDelay...
1505536681117 : MyCmd is done!
1505536686118 : MyCmd is done!
分享到:
评论
1 楼 senninha 2017-08-29  
这个。。是api说明吧。。

相关推荐

    JUC并发编程与源码分析视频课.zip

    《JUC并发编程与源码分析视频课》是一门深入探讨Java并发编程的课程,主要聚焦于Java Util Concurrency(JUC)库的使用和源码解析。JUC是Java平台提供的一组高级并发工具包,它极大地简化了多线程编程,并提供了更...

    Java并发Timer源码分析

    Java并发Timer源码分析 Java并发编程是Java编程中一个非常重要的方面,java.util.Timer是Java中的一个基本组件,用于实现延时和周期性任务的执行。但是,Timer存在一些缺陷,如创建唯一的线程来执行所有Timer任务,...

    java线程池的源码分析.zip

    本文将深入探讨Java线程池的源码分析,并对比不同类型的线程池,以帮助开发者更好地理解和利用这一强大的工具。 首先,我们要理解Java线程池的核心类`java.util.concurrent.ThreadPoolExecutor`,它是所有自定义...

    ton-watcher-源码.rar

    【源码分析——深入理解"ton-watcher"】 在IT领域,源码分析是一项至关重要的技能,它能帮助我们理解软件的工作原理,发现潜在的问题,甚至进行二次开发或优化。"ton-watcher"是一个可能涉及监控、日志分析或者系统...

    javaAlerter_JAVA源码_

    Java作为一门广泛使用的编程语言,其源码分析对于我们深入理解面向对象编程、线程管理和时间调度等概念具有重要意义。 【描述】"A small Java timer source" 描述了这是一个小型的Java计时器程序,它的核心功能是...

    Spring 定时任务源码(spring 三种定时任务的实现方式)

    下面将详细讲解这三种定时任务的实现方式及其源码分析。 1. **基于TaskExecutor的定时任务** TaskExecutor接口是Spring提供的一个异步任务执行接口,它并不直接支持定时任务,但可以通过配合...

    Spring定时调度简单实现源码

    6. **源码分析**: 分析`Spring定时调度简单实现源码.rar`中的源码,我们可以理解具体如何在Spring项目中配置和使用定时任务。这包括`ApManager`类的设计,`@Scheduled`的使用,以及可能的`TaskScheduler`配置。...

    java study

    例如,你可能会在资料中找到对Java集合框架、并发库或者Spring框架的源码分析。这些分析可以帮助我们提升编程技巧,解决实际问题时更加得心应手。 其次,“工具”标签则意味着这个压缩包可能包含了一些开发工具的...

    TimerSrc-源码.rar

    2. 源码分析:理解并分析源代码是开发者学习新知识、调试问题或改进现有代码的重要步骤。这可能涉及到代码结构、算法实现、设计模式等多方面内容。 3. 时间管理:这部分可能涉及到时间戳、时钟同步、延迟处理等概念...

    JAVA定时器

    这篇博文可能是分析了这两种定时器的使用方法和源码解析。 `java.util.Timer` 是Java早期提供的定时器,它通过`TimerTask`类来定义需要定时执行的任务。创建一个`Timer`实例后,可以调用`schedule(TimerTask task, ...

    计时器源码.rar

    - **Java**:Java中,`java.util.Timer`和`java.util.concurrent.ScheduledExecutorService`是常用的计时器实现。 - **Python**:Python有`time`模块和`threading`模块中的`Timer`类来创建计时器。 - **...

    自制定时关机小程序开放源码

    通过分析和理解源码,我们可以深入了解到如何在编程中实现定时任务和系统级别的操作。 首先,我们需要了解的是定时任务的实现原理。在编程中,定时任务通常由计时器或调度器来完成。例如,在Java中,可以使用...

    JAVA定时任务

    在实际开发中,源码分析对于理解定时任务的工作原理至关重要。例如,通过阅读`ScheduledThreadPoolExecutor`的源码,我们可以了解其调度策略和线程池的管理方式。同时,利用IDE(如IntelliJ IDEA或Eclipse)的调试...

    相爱纪念日源码

    相爱纪念日源码是一款特别的程序,它展示了程序员如何运用技术来表达情感,为生活添加一...通过分析和理解这个源码,程序员不仅可以学习到具体的编程技术,还能了解到如何将技术应用于生活,创造出富有情感价值的产品。

    java7并发编程实战手册+源码

    配合书中的源码分析,可以更直观地理解多线程编程的实践技巧。同时,111.zip可能包含书中的一些示例代码或补充材料,进一步加深对知识的理解和实践。 总的来说,Java 7在并发编程方面提供了许多强大的工具和机制,...

    基于Java的酒店管理系统源码

    同时,源码需要包含定时任务来定期生成报表,这通常使用Java的ScheduledExecutorService或者Quartz等调度框架实现。 在系统架构层面,Java的MVC(Model-View-Controller)设计模式被广泛采用,以保证代码的清晰性...

    AliDDNS.rar

    阿里云DDNS(Dynamic Domain Name System)源码分析 阿里云DDNS服务是一种动态域名解析服务,它允许用户的公网IP地址发生变化时,自动更新DNS记录,确保用户可以通过固定的域名访问到不断变化的公网IP地址。在...

    javaalert_JAVA源码_

    【标题】"javaalert_JAVA源码_" 暗示我们关注的是一个使用Java编程语言编写的关于提醒功能的程序。在Java中,创建一个定时提醒任务通常涉及到使用`java.util.Timer`类或`java.time`包中的定时器功能。让我们深入探讨...

    Thunder.zip,雷霆战机源码,实习项目,Java雷霆战机

    【雷霆战机源码分析】 雷霆战机是一款基于Java编程语言开发的实习项目,旨在提供一个学习和实践的机会,帮助开发者深入理解和应用Java技术。这个项目的源码涵盖了游戏开发的基础概念,如对象导向编程、图形渲染、...

Global site tag (gtag.js) - Google Analytics