LilyBookStore中用到的是Spring整合的Quartz框架,用它来完成每日更新索引的计划。Quartz本身是和xwork同一家公司开发的,虽然最近一两年已经没有新版本问世了,但是还有有挺高的曝光率。Quartz最为强大的是一个Cron表达式,利用这个表达式可以更加直观地定义任务调用的具体时间或时间间隔,而不必去苦苦地计算delay和interval。再一个好处由于与Spring整合,可以完美地融入Spring管理的对象中去,加上Spring还封装了一个MethodInvokeBean,更是大大方便了任务调度的编写,基本上在Spring的参与下,不用写一行与Quartz有关的代码,只要写xml配置即可。而且Quartz提供了线程池的管理,默认的情况下有10个线程,还是比较成熟的。
Winter项目也用到了任务调度的功能,需求时每2个小时统计一下各处的发贴数和分值,更新相关数据列。起初是用java.util.Timer和java.util.TimerTask实现的,没有真正运行过。今天看Java Thread一书,说到这种方式的一个弊端,当前一次尚在执行,而后一次已经开始的情况下,用Timer实现的程序会出现问题,为此不得不在每次任务启动时判断上次任务是否已经结束。从Java 5.0开始,java.util.concurrent包中增加了一个ScheduledThreadPoolExecutor类,用来实现定时任务和线程池的管理,比起Timer简陋的实现是要强大得多了,可能也是Quartz不再开发的一个重要原因。ScheduledThreadPoolExecutor还可以和Java 5引入的一系列多线程机制协作,可惜这方面我还没有理解透,不知道能够为已有的程序增加怎样的保护。简单地来说,利用ScheduledThreadPoolExecutor的scheduleAtFixedRate和scheduleWithFixedDelay两个方法就可以实现任务调度的基本功能,从前用Timer实现的功能应该要迁移到scheduleWithFixedDelay上了
分享到:
相关推荐
这通常涉及创建一个 `TimerTask` 对象,它定义了要执行的任务,然后将其与 `Timer` 关联。 - `TimerTask`:这是 `Timer` 调度的任务,是一个抽象类,你需要继承并覆盖其 `run()` 方法来定义要执行的具体任务。 2. ...
Java中的定时器(Timer)是Java.util包下用于执行定期任务的一个类,它与线程(Thread)紧密关联,能够帮助开发者实现定时执行特定任务的需求。这个机制在多线程编程(multithreading)中非常有用,特别是在需要定期...
`Timer`类的创建与使用 创建一个`Timer`对象非常简单,只需要调用其构造函数即可: ```java Timer timer = new Timer(); ``` ### 2. 定时任务的调度 `Timer`类主要通过`schedule`系列方法来安排任务的执行。...
从JDK5开始,可以使用ScheduledThreadPoolExecutor来替代Timer。ScheduledThreadPoolExecutor提供了更强大的调度功能,可以实现更复杂的定时任务。例如,可以使用ScheduledThreadPoolExecutor来实现固定频率的任务...
`TimerTask.cancel()` 只会取消当前正在执行的任务,而`Timer.cancel()` 会取消所有与该`Timer`关联的任务并停止`Timer`线程。 5. **注意事项**: - `Timer` 类的线程是非守护线程,这意味着只要还有`TimerTask` ...
Java 5之后,`ScheduledExecutorService`和`ScheduledThreadPoolExecutor`提供了更强大的定时任务处理能力,它们是基于并发包(`java.util.concurrent`)的,具有更好的线程管理和取消任务的能力,因此在现代Java开发...
在Java 1.6版本之后,`java.util.concurrent` 包下引入了`ScheduledThreadPoolExecutor`,这是一个非常强大的工具,可以实现定时器和延时加载功能,相比旧的`Timer`类,它提供了更多的控制和并发处理能力。...
Timers schedule one-shot or recurring TimerTask tasks for execution. Prefer java.util.concurrent.ScheduledThreadPoolExecutor ScheduledThreadPoolExecutor for new code.
2. **定时器的使用**:创建`TimerTask`实例后,我们将其与`Timer`关联。例如: ```java TimerTask task = new TimerTask() { @Override public void run() { // 更新秒表状态的代码 } }; ``` 然后,我们...
与`Timer`相比,`ScheduledExecutorService`提供了更丰富的调度选项,并且不会因单个任务的异常而影响其他任务。 ### 2.2 优点 - 支持取消任务 - 可以设置任务的执行顺序 - 支持固定延迟和固定速率的调度 - 提供了...
java线程类源码Java ScheduledThreadPoolExecutor演示 java.util.concurrent ScheduledThreadPoolExecutor作为java.util.Timer类的现代替代。
在这里,`initialDelay`、`period`和`TimeUnit`与`Timer`类似,但`ScheduledExecutorService`提供了更细粒度的时间控制和更好的线程管理。 总结来说,Java定时器服务主要通过`Timer`和`TimerTask`实现,用于计划...
- `scheduleWithFixedDelay(TimerTask task, long delay, long interval)`:与`scheduleAtFixedRate`类似,但考虑到执行时间,下一个任务的启动时间会考虑上一个任务实际耗时。 4. **示例代码**: ```java ...
`ScheduledThreadPoolExecutor`是实现该接口的一个类,可以替代`Timer`类以获得更好的性能和灵活性。 7. **使用场景**:Java定时器适用于多种场景,如定期检查数据库连接、定期备份数据、执行清理任务、实现心跳...
例如,使用`ScheduledThreadPoolExecutor`实现定时器: ```java ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); Runnable task = () -> { // 定义任务 }; executor....
Java Schedule 是一个与Java编程相关的主题,主要涉及的是在Java中如何进行任务调度。在Java中,任务调度是通过各种API来实现的,这使得开发者能够按照预设的时间间隔执行特定的任务,例如定时任务、周期性任务等。...
实现 `ScheduledExecutorService` 的常见类有 `ScheduledThreadPoolExecutor`。下面是一个示例: ```java import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import ...
- 与 `Timer` 不同,`ScheduledExecutorService` 在任务出现异常时不会停止整个服务,而是仅取消当前任务,使得其他任务可以继续执行。 - 当不再需要定时任务时,可以通过 `shutdown()` 或 `shutdownNow()` 方法...
例如,通过阅读`ScheduledThreadPoolExecutor`的源码,我们可以了解其调度策略和线程池的管理方式。同时,利用IDE(如IntelliJ IDEA或Eclipse)的调试工具,可以帮助我们更好地理解定时任务的执行流程。 此外,工具...
Java的Executor框架提供了线程池管理的相关类,如ThreadPoolExecutor和ScheduledThreadPoolExecutor,后者支持定时或周期性的任务调度。 线程池调度的优点在于可以重用线程,减少线程创建和销毁的开销,提高执行...