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!
分享到:
相关推荐
《JUC并发编程与源码分析视频课》是一门深入探讨Java并发编程的课程,主要聚焦于Java Util Concurrency(JUC)库的使用和源码解析。JUC是Java平台提供的一组高级并发工具包,它极大地简化了多线程编程,并提供了更...
Java并发Timer源码分析 Java并发编程是Java编程中一个非常重要的方面,java.util.Timer是Java中的一个基本组件,用于实现延时和周期性任务的执行。但是,Timer存在一些缺陷,如创建唯一的线程来执行所有Timer任务,...
本文将深入探讨Java线程池的源码分析,并对比不同类型的线程池,以帮助开发者更好地理解和利用这一强大的工具。 首先,我们要理解Java线程池的核心类`java.util.concurrent.ThreadPoolExecutor`,它是所有自定义...
【源码分析——深入理解"ton-watcher"】 在IT领域,源码分析是一项至关重要的技能,它能帮助我们理解软件的工作原理,发现潜在的问题,甚至进行二次开发或优化。"ton-watcher"是一个可能涉及监控、日志分析或者系统...
Java作为一门广泛使用的编程语言,其源码分析对于我们深入理解面向对象编程、线程管理和时间调度等概念具有重要意义。 【描述】"A small Java timer source" 描述了这是一个小型的Java计时器程序,它的核心功能是...
下面将详细讲解这三种定时任务的实现方式及其源码分析。 1. **基于TaskExecutor的定时任务** TaskExecutor接口是Spring提供的一个异步任务执行接口,它并不直接支持定时任务,但可以通过配合...
6. **源码分析**: 分析`Spring定时调度简单实现源码.rar`中的源码,我们可以理解具体如何在Spring项目中配置和使用定时任务。这包括`ApManager`类的设计,`@Scheduled`的使用,以及可能的`TaskScheduler`配置。...
例如,你可能会在资料中找到对Java集合框架、并发库或者Spring框架的源码分析。这些分析可以帮助我们提升编程技巧,解决实际问题时更加得心应手。 其次,“工具”标签则意味着这个压缩包可能包含了一些开发工具的...
2. 源码分析:理解并分析源代码是开发者学习新知识、调试问题或改进现有代码的重要步骤。这可能涉及到代码结构、算法实现、设计模式等多方面内容。 3. 时间管理:这部分可能涉及到时间戳、时钟同步、延迟处理等概念...
这篇博文可能是分析了这两种定时器的使用方法和源码解析。 `java.util.Timer` 是Java早期提供的定时器,它通过`TimerTask`类来定义需要定时执行的任务。创建一个`Timer`实例后,可以调用`schedule(TimerTask task, ...
- **Java**:Java中,`java.util.Timer`和`java.util.concurrent.ScheduledExecutorService`是常用的计时器实现。 - **Python**:Python有`time`模块和`threading`模块中的`Timer`类来创建计时器。 - **...
通过分析和理解源码,我们可以深入了解到如何在编程中实现定时任务和系统级别的操作。 首先,我们需要了解的是定时任务的实现原理。在编程中,定时任务通常由计时器或调度器来完成。例如,在Java中,可以使用...
在实际开发中,源码分析对于理解定时任务的工作原理至关重要。例如,通过阅读`ScheduledThreadPoolExecutor`的源码,我们可以了解其调度策略和线程池的管理方式。同时,利用IDE(如IntelliJ IDEA或Eclipse)的调试...
相爱纪念日源码是一款特别的程序,它展示了程序员如何运用技术来表达情感,为生活添加一...通过分析和理解这个源码,程序员不仅可以学习到具体的编程技术,还能了解到如何将技术应用于生活,创造出富有情感价值的产品。
配合书中的源码分析,可以更直观地理解多线程编程的实践技巧。同时,111.zip可能包含书中的一些示例代码或补充材料,进一步加深对知识的理解和实践。 总的来说,Java 7在并发编程方面提供了许多强大的工具和机制,...
同时,源码需要包含定时任务来定期生成报表,这通常使用Java的ScheduledExecutorService或者Quartz等调度框架实现。 在系统架构层面,Java的MVC(Model-View-Controller)设计模式被广泛采用,以保证代码的清晰性...
阿里云DDNS(Dynamic Domain Name System)源码分析 阿里云DDNS服务是一种动态域名解析服务,它允许用户的公网IP地址发生变化时,自动更新DNS记录,确保用户可以通过固定的域名访问到不断变化的公网IP地址。在...
【标题】"javaalert_JAVA源码_" 暗示我们关注的是一个使用Java编程语言编写的关于提醒功能的程序。在Java中,创建一个定时提醒任务通常涉及到使用`java.util.Timer`类或`java.time`包中的定时器功能。让我们深入探讨...
【雷霆战机源码分析】 雷霆战机是一款基于Java编程语言开发的实习项目,旨在提供一个学习和实践的机会,帮助开发者深入理解和应用Java技术。这个项目的源码涵盖了游戏开发的基础概念,如对象导向编程、图形渲染、...