乐趣区

关于java:不用任何框架Java-就能实现定时任务的-3-种方法

是的,不必任何框架,用咱们奢侈的 Java 编程语言就能实现定时工作。

明天,栈长就介绍 3 种实现办法,教你如何应用 JDK 实现定时工作!

1、sleep

这也是咱们最罕用的 sleep 休眠大法,不只是当作休眠用,咱们还能够利用它很轻松的能实现一个简略的定时工作。

实现逻辑:

新开一个线程,增加一个 for/ while 死循环,而后在死循环外面增加一个 sleep 休眠逻辑,让程序每隔 N 秒休眠再执行一次,这样就达到了一个简略定时工作的成果。

实现代码如下:

/**
 * 休眠实现定时工作
 * 起源公众号:Java 技术栈
 */
private static void sleepTask() {new Thread(() -> {while (true) {System.out.println("hi, 欢送关注:Java 技术栈");

            try {
                // 每隔 3 秒执行一次
                Thread.sleep(3000);
            } catch (InterruptedException e) {e.printStackTrace();
            }
        }
    }).start();}

这种形式比拟傻瓜化了,只能按固定频率运行,不能指定具体运行的工夫。

另外,下面的箭头语法,栈长应用了 JDK 8 中的 Lambda 表达式,这里就不再撰述了,Java 8 系列实战教程我都写了一堆了,不分明的能够关注公众号:Java 技术栈,在后盾回复 “java” 浏览,我都整顿好了。

2、Timer

来看下 JDK 自带的 java.util.Timer 类:

JDK 1.3 就内置了 java.util.Timer 类,能够用来调度 java.util.TimerTask 工作。

几个重要的办法:

  • schedule:开始调度工作,提供了几个包装办法;
  • cancle:终止任务调度,勾销以后调度的所有工作,正在运行的工作不受影响;
  • purge:从工作队列中移除所有已勾销的工作;

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

实现代码如下:

/**
 * timer 定时工作
 * 起源公众号:Java 技术栈
 */
private static void timerTask() throws InterruptedException {Timer timer = new Timer();

    TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {System.out.println("hi, 欢送关注:Java 技术栈");
        }
    };

    // 第一次工作延迟时间
    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 是单线程的,如果有工作 A,B,C,工作 A 如果执行工夫比拟长,那么就会影响工作 B,C 的启动和执行工夫,如果 B,C 执行工夫也比拟长,那就会相互影响;
  • Timer 不会捕捉异样,如果 A,B,C 任何一个工作在执行过程中产生异样,就会导致 TImer 整个定时工作进行工作;
  • Timer 是基于相对工夫调度的,而不是基于绝对工夫,所以它对系统工夫的扭转十分敏感;

所以,如果在应用 Timer 的过程中要留神这些缺点,尽管能够用,但不举荐。

3、ScheduledExecutorService

因 Timer 有一些缺点,所以不太倡议应用 Timer,举荐应用 ScheduledExecutorService:

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

java.util.concurrent.Executors.newScheduledThreadPool

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

几个重要的调度办法:

  • schedule:只执行一次调度;
  • scheduleAtFixedRate:按固定频率调度,如果执行工夫过长,下一次调度会提早,不会同时执行;
  • scheduleWithFixedDelay:提早调度,上一次执行完再加上延迟时间后执行;

另外,能够看出,工作是反对 Runnable 和 Callable 调度的。

实现代码如下:

/**
 * 线程池定时工作
 * 起源公众号:Java 技术栈
 */
public static void poolTask(){ScheduledExecutorService pool = Executors.newScheduledThreadPool(10);

    pool.scheduleAtFixedRate(() -> {System.out.println("hi, 欢送关注:Java 技术栈");
    }, 2000, 3000, TimeUnit.MILLISECONDS);
}

这是一个按固定频率调度的工作,创立了 10 个外围线程数,首次执行提早 2 秒,后续每 3 秒执行一次。

这种形式简略、好用,防止了应用 Timer 带来的各种问题,举荐应用这种实现形式。

总结

好了,本文栈长分享了 3 种 Java 实现定时工作的形式,也绝对简略,但执行频率工夫设置都太简略,只适宜简略的业务,不适宜理论简单业务的需要,理论业务要思考分布式、故障转移复原等远要简单的多。

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

最初,Java 系列教程还会持续更新,关注 Java 技术栈公众号第一工夫推送,还能够在公众号菜单中获取历史 Java 教程,都是干货。

本节教程所有实战源码已上传到这个仓库:

https://github.com/javastacks…

最初,感觉我的文章对你用播种的话,动动小手,给个在看、转发,原创不易,栈长须要你的激励。

版权申明:本文系公众号 “Java 技术栈 ” 原创,原创实属不易,转载、援用本文内容请注明出处,禁止剽窃、洗稿,请自重,尊重别人劳动成果和知识产权。

近期热文举荐:

1.600+ 道 Java 面试题及答案整顿 (2021 最新版)

2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!

3. 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

退出移动版