`
jaesonchen
  • 浏览: 309920 次
  • 来自: ...
社区版块
存档分类
最新评论

ScheduledExecutorService执行周期性或定时任务

 
阅读更多

ScheduledExecutorService扩展了ExecutorService接口,提供时间排程的功能。

 

schedule(Callable<V> callable, long delay, TimeUnit unit)

         创建并执行在给定延迟后启用的 ScheduledFuture。

schedule(Runnable command, long delay, TimeUnit unit)

         创建并执行在给定延迟后启用的一次性操作。

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnitunit)

         创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay 后开始执行,然后在initialDelay+period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。

scheduleWithFixedDelay(Runnable command, long initialDelay, long delay,TimeUnit unit)

         创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。

 

 

 

schedule方法被用来延迟指定时间来执行某个指定任务。如果你需要周期性重复执行定时任务可以使用scheduleAtFixedRate或者scheduleWithFixedDelay方法,它们不同的是前者以固定频率执行,后者以相对固定频率执行。

 

 

不管任务执行耗时是否大于间隔时间,scheduleAtFixedRate和scheduleWithFixedDelay都不会导致同一个任务并发地被执行。唯一不同的是scheduleWithFixedDelay是当前一个任务结束的时刻,开始结算间隔时间,如0秒开始执行第一次任务,任务耗时5秒,任务间隔时间3秒,那么第二次任务执行的时间是在第8秒开始。

 

ScheduledExecutorService的实现类,是ScheduledThreadPoolExecutor。ScheduledThreadPoolExecutor对象包含的线程数量是没有可伸缩性的,只会有固定数量的线程。不过你可以通过其构造函数来设定线程的优先级,来降低定时任务线程的系统占用。

 

 

特别提示:通过ScheduledExecutorService执行的周期任务,如果任务执行过程中抛出了异常,那么过ScheduledExecutorService就会停止执行任务,且也不会再周期地执行该任务了。所以你如果想保住任务都一直被周期执行,那么catch一切可能的异常。

 

    

package test;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
* create at 11-10-14
* @author KETQI
* @category
*/
public class TestScheduledThreadPoolExecutor {
    private static SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public static void main(String[] args{
        //ScheduledExecutorService exec=Executors.newScheduledThreadPool(1);

 

        ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
        /**
         *每隔一段时间打印系统时间,互不影响的<br/>
         * 创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;<br/>
         * 也就是将在 initialDelay 后开始执行,然后在initialDelay+period 后执行,<br/>
         * 接着在 initialDelay + 2 * period 后执行,依此类推。
         */
        exec.scheduleAtFixedRate(new Runnable() {
            public void run() {
                System.out.println(format.format(new Date()));
            }
        }, 1000, 5000, TimeUnit.MILLISECONDS);

        //开始执行后就触发异常,next周期将不会运行
        exec.scheduleAtFixedRate(new Runnable() {
            public void run() {
                System.out.println("RuntimeException no catch,next time can't run");
                throw new RuntimeException();
            }
        }, 1000, 5000, TimeUnit.MILLISECONDS);

        //虽然抛出了运行异常,当被拦截了,next周期继续运行
        exec.scheduleAtFixedRate(new Runnable() {
            public void run() {
                try{
                    throw new RuntimeException();
                }catch (Exception e){
                    System.out.println("RuntimeException catched,can run next");
                }
            }
        }, 1000, 5000, TimeUnit.MILLISECONDS);

        /**
         * 创建并执行一个在给定初始延迟后首次启用的定期操作,<br/>
         * 随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。
         */
        exec.scheduleWithFixedDelay(new Runnable() {
            public void run() {
                System.out.println("scheduleWithFixedDelay:begin,"+format.format(new Date()));
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e{
                    e.printStackTrace();
                }
                System.out.println("scheduleWithFixedDelay:end,"+format.format(new Date()));
            }
        },1000,5000,TimeUnit.MILLISECONDS);

        /**
         * 创建并执行在给定延迟后启用的一次性操作。
         */
        exec.schedule(new Runnable() {
            public void run() {
                System.out.println("The thread can only run once!");
            }
        },5000,TimeUnit.MILLISECONDS);
    }
}
分享到:
评论

相关推荐

    java web使用监听器实现定时周期性执行任务demo

    在这个"java web使用监听器实现定时周期性执行任务demo"中,我们将探讨如何利用Java的Servlet监听器(Listener)和定时任务API来达到这个目标。 首先,我们要了解Java中的监听器。在Java Web应用程序中,监听器是...

    ScheduledExecutorService任务定时代码示例

    ScheduledExecutorService 是 Java 中的并发编程 API,用于执行延迟或周期性的任务。下面是对 ScheduledExecutorService 的任务定时代码示例的详细解释。 ScheduledExecutorService 的作用 ...

    TimerTask执行每日定时任务

    这两个类属于`java.util`包,为开发者提供了执行周期性或一次性任务的能力。下面我们将深入探讨如何利用`TimerTask`执行每日定时任务。 首先,`TimerTask`是Java中的一个抽象类,它代表了一个可以被`Timer`对象调度...

    6.2 创建定时和周期任务

    4. **ScheduledExecutorService**:这是Java并发库提供的一个强大的定时执行工具,它可以创建一个线程池来执行周期性任务。通过`scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit ...

    Java定时执行某个任务

    `ScheduledExecutorService`提供了更强大的功能,如支持固定延迟执行、周期性执行以及精确到纳秒的调度。以下是一个使用`ScheduledExecutorService`的例子: ```java import java.util.concurrent.Executors; ...

    Spring定时任务实现(非Web项目)

    3. **ThreadPoolTaskScheduler**:这是Spring提供的定时任务调度器,它可以基于Java的`ScheduledExecutorService`来执行周期性的任务。 4. **@Scheduled**:这是一个注解,用于标记需要定时执行的方法。 在非Web...

    Java定时任务及其在工作流系统中的应用.pdf

    周期性的定时任务是指按照固定的时间间隔执行的任务,而非周期性的定时任务是指在特定的时间点执行的任务。 二、Java定时任务的类型 Java提供了多种定时任务机制,包括: * Timer类:Timer类是Java平台提供的最...

    java quartz 定时任务

    - 定时任务是在特定时间点自动执行的程序或任务,常用于执行周期性维护、数据同步、定时报告等。在Java中,可以使用ScheduledExecutorService或者Quartz来实现定时任务。 3. **Cron表达式**: - Cron表达式是Unix...

    java 定时执行任务

    在Java中,有两种主要的方式来实现定时任务:Java.util.Timer类和java.util.concurrent包下的ScheduledExecutorService接口。下面我们将详细探讨这两种方法。 1. Java.util.Timer类和TimerTask `Timer`类是Java早期...

    IntelliJ IDEA中创建Spring boot项目,定时任务测试

    3. **单元测试**:为确保定时任务的正确性,可以编写单元测试,使用`@Test`和`@ScheduledExecutorService`模拟任务调度,测试任务逻辑。 通过以上步骤,我们便能在IntelliJ IDEA中成功创建一个Spring Boot项目,并...

    java 定时任务及jar包

    Java定时任务是Java编程中一个重要的特性,它允许开发者安排任务在特定的时间点或周期性地执行。在Java中,我们可以使用内置的`java.util.Timer`类和`java.util.concurrent.ScheduledExecutorService`来实现定时任务...

    计划任务 定时执行

    计划任务,也称为定时任务或调度任务,是一种让计算机在特定时间自动执行特定任务的技术。在Windows系统中,我们通常使用“任务计划程序”;在Linux和Unix系统中,对应的是“cron”服务。这些工具允许用户定义一个...

    Timer定时任务

    如果希望任务周期性执行,可以使用`scheduleAtFixedRate`方法,它会在第一次执行后按照固定的频率重复: ```java timer.scheduleAtFixedRate(new MyTask(), initialDelay, period); ``` 这里,`initialDelay`是...

    ScheduledExecutorService 计时器任务处理

    ScheduledExecutorService是Java并发编程中一个非常重要的工具类,它属于ExecutorService接口的一个实现,主要用于执行定时或周期性的任务。这个服务提供了强大的定时任务管理能力,可以用来安排在未来某一时刻或者...

    定时任务管理

    在IT行业中,定时任务管理是一项至关重要的功能,它允许系统或应用程序按照预设的时间间隔执行特定的任务。定时任务管理广泛应用于各种场景,如数据备份、日志清理、系统监控、自动化测试以及邮件发送等。本篇文章将...

    JAVA定时任务调度

    它可以并发执行任务,支持一次性或周期性的任务安排,并且可以精确控制任务的执行时间。例如: ```java ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); Runnable task = () -&gt; ...

    java定时任务开源案例

    - `java.util.Timer`: 这是Java标准库中提供的一种简单的定时任务调度器,它可以安排一次性或周期性的任务。然而,`Timer`并不适合并发环境,因为它只有一个线程处理所有任务,可能导致任务间的相互阻塞。 - `java...

    JAVA定时任务

    Java定时任务是Java编程中一个重要的概念,它允许开发者在特定的时间间隔或特定时间执行某项任务,这对于系统维护、数据备份、定时提醒等场景非常有用。本篇将围绕Java定时任务这一主题展开,深入探讨相关知识。 1....

    java定时执行多任务和quartz定时执行多任务

    - `java.util.Timer`: 这是一个简单的定时器,可以安排单次或周期性的任务。它通过`TimerTask`类来定义要执行的任务。但是,`Timer`类不是线程安全的,当多个任务并发执行时可能出现问题。 - `java.util....

    java 定时任务管理框架

    2. **图形化管理**:提供了一个用户友好的界面,便于非技术人员操作,如添加新的定时任务、调整任务执行周期等。 3. **任务调度**:支持多种调度策略,如定时执行、一次性执行、依赖于其他任务执行等。 4. **状态...

Global site tag (gtag.js) - Google Analytics