• 不用任何框架,Java 就能实现定时任务的 3 种方法


    1、 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();
    }

     

    2、Timer

    几个重要的方法:

    • 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();
    }

     

    3、ScheduledExecutorService

    • 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);
    }

  • 相关阅读:
    利用XAF中的FeatureCenter例子的,直接打开DetailView
    XAF 应用程序模型基础[转]
    XAF 如何给記錄增加版本控制?
    Simpler way to Create a Custom User Control
    建议将小川同志免费租借给欧洲用30年[转]文/端宏斌
    第六集 MSF构思阶段项目团队的组建
    MS_HotFix
    C#域内远程机文件信息注册表访问。
    访问 远程机 盘符 设置
    Silk_ 运行时_控件_属性_捕捉.
  • 原文地址:https://www.cnblogs.com/KL2016/p/15975766.html
Copyright © 2020-2023  润新知