前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java定时器的使用

Java定时器的使用

作者头像
sunonzj
发布2022-06-21 13:24:45
5960
发布2022-06-21 13:24:45
举报
文章被收录于专栏:zjblogzjblog

最近要用到定时任务,就是超过48小时的数据给关闭,前台就不显示了。还是头一次使用java的定时器,。。java定时器使用Timer类。有时间得看下源码了,看看具体咋弄的。

Timer主要用于Java线程里指定时间或周期运行任务。Timer是线程安全的,但不提供实时性(real-time)保证。先看看调用timer的几种方式。

代码语言:javascript
复制
    /**
     * 这个方法是调度一个task,经过2000(ms)后开始进行调度,仅仅调度一次。
     */
    public static void timer1(){
        Timer nTimer = new Timer();
        nTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("----设定要指定任务-----");
            }
        },2000);
    }

    /**
     * 在指定的时间点time上调度一次。
     */
    public static void timer2() {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("-------延迟5000毫秒,每1000毫秒执行一次--------");
            }
        }, time);
    }

    /**
     * 延迟5000毫秒,每1000毫秒执行一次
     *  在5000(ms)后开始调度,每次调度完后,最少等待1000(ms)后才开始调度。
     */
    public static void timer3() {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                System.err.println("-------延迟5000毫秒,每1000毫秒执行一次--------");
            }
        }, 5000, 1000);
    }
    /**
     * 设置17:56执行任务(第一次调度的时间),每过一天执行一次
     * java.util.Timer.scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
     */
    public static void timer4() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 17);
        calendar.set(Calendar.MINUTE, 26);
        calendar.set(Calendar.SECOND, 0);

        Date time = calendar.getTime();

        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                System.out.println("-------设定要指定任务--------");
            }
        }, time, 1000 * 60 * 60 * 24);// 这里设定将延时每天固定执行
    }

以上就是调用的几种方法,再贴下我的代码

代码语言:javascript
复制
        // 时间间隔(一天)
        long periodDay = 24 * 60 * 60 * 1000;
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 1); // 凌晨1点
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        Date date = calendar.getTime(); // 第一次执行定时任务的时间
        // 如果第一次执行定时任务的时间 小于当前的时间
        // 此时要在 第一次执行定时任务的时间加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。
        if (date.before(new Date())) {
            date = this.addDay(date, 1);
        }
        new Timer().scheduleAtFixedRate(new TimerTask() {
            public void run() {
                Date now = new Date();
                //查出所有未关闭数据
                List<BankWork> list = bankWorkService.findList(new BankWork().setStatus(Const.DEFAULT_STATUS));
                //筛选出超过48小时的未关闭数据
                list = list.stream().filter(e -> {
                    try {
                        return judgmentDate(e.getModifiedTime(), now);
                    } catch (Exception e1) {
                        e1.printStackTrace();
                    }
                    return false;
                }).collect(Collectors.toList());
                list.forEach(e -> e.setStatus(Const.BANK_WORK_STATUS_OK).setModifiedTime(now));
                //修改所有未关闭数据为关闭
                bankWorkService.updateAsGroup(list);
            }
        }, date, periodDay);
        
        // 判断时间是否超过48小时
    private static boolean judgmentDate(Date date1, Date date2) throws Exception {

        long cha = date2.getTime() - date1.getTime();
        if (cha < 0) {
            return false;
        }
        double result = cha * 1.0 / (1000 * 60 * 60);
        if (result <= 48) {
            return true;
        } else {
            return false;
        }

    }

    // 增加或减少天数
    private Date addDay(Date date, int num) {
        Calendar startDT = Calendar.getInstance();
        startDT.setTime(date);
        startDT.add(Calendar.DAY_OF_MONTH, num);
        return startDT.getTime();
    }

参考博客:https://www.cnblogs.com/0201zcr/p/4703061.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-04-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档