Java中实现定时任务的3种方法!-LMLPHP

  • 另外,java.util.TimerTask 就是实现了 Runnable 接口,具体任务逻辑则是在 run 方法里去实现。

    实现代码如下:

    /**
     * timer定时任务
     */
    private static void timerTask() throws InterruptedException {
        Timer timer = new Timer();

        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("hi, 欢迎关注");
            }
        };

        // 第一次任务延迟时间
        long delay = 2000;

        // 任务执行频率
        long period = 3 * 1000;

        // 开始调度
        timer.schedule(timerTask, delay, period);
        
        // 指定首次运行时间
    // timer.schedule(timerTask, DateUtils.addSeconds(new Date(), 5), period);

        Thread.sleep(20000);

        // 终止并移除任务
        timer.cancel();
        timer.purge();
    }

    这种实现方式比较简单,可以指定首次执行的延迟时间、首次执行的具体日期时间,以及执行频率,能满足日常需要。

    另外,需要注意的是,Timer 是线程安全的,因为背后是单线程在执行所有任务。

    Timer 也会有一些缺陷:

    所以,如果在使用 Timer 的过程中要注意这些缺陷,虽然可以用,但不推荐。

    3、ScheduledExecutorService

    因 Timer 有一些缺陷,所以不太建议使用 Timer,推荐使用 ScheduledExecutorService:

    ScheduledExecutorService 即是 Timer 的替代者,JDK 1.5 并发包引入,是基于线程池设计的定时任务类:

    上了线程池,每个调度任务都会分配到线程池中的某一个线程去执行,任务就是并发调度执行的,任务之间互不影响。

    几个重要的调度方法:

    另外,可以看出,任务是支持 Runnable 和 Callable 调度的。

    实现代码如下:

    /**
     * 线程池定时任务
     */
    public static void poolTask(){
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(10);

        pool.scheduleAtFixedRate(() -> {
            System.out.println("hi, 欢迎关注");
        }, 2000, 3000, TimeUnit.MILLISECONDS);
    }

    这是一个按固定频率调度的任务,创建了 10 个核心线程数,首次执行延迟 2 秒,后续每 3 秒执行一次。

    这种方式简单、好用,避免了使用 Timer 带来的各种问题,推荐使用这种实现方式。

    总结

    本文分享了 3 种  Java 实现定时任务的方式,也相对简单,但执行频率时间设置都太简单,只适合简单的业务,不适合实际复杂业务的需求,实际业务要考虑分布式、故障转移恢复等远要复杂的多。

    本文仅给大家一个参考吧,在不用框架的前提下也能实现定时任务,在小而美的场景,还是很香的。

    
    
    
    
    
                 
                
               
              
             
            
    
    
    
           
    
    
    
          
    
    
    
         
    
    
    
        



    本文分享自微信公众号 - Java中文社群(javacn666)。
    如有侵权,请联系 support@oschina.cn 删除。
    本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

    03-24 15:23