使用JDK中的JUC中的延时队列来自定义定时任务

本文介绍了如何利用Java并发包(JUC)中的延时队列来定制定时任务,适用于周报、月度报表等场景。这种方法具有异步执行、解耦合和时间驱动等优点。文章提供了实现代码,包括创建自定义定时任务类并进行测试,测试结果显示任务在系统启动5秒后首次执行,然后每10秒执行一次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义定时任务

通过JDK自带了多种实现定时任务的接口:juc中的线程池,定时器Timer,死循环,juc延时队列。我们就使用juc延时队列来实现自定义的定时任务。

适用场景

周报、月度报表之类的统计数据任务。

优点:

异步执行、实现代码的解耦合

数据批量处理

时间驱动

实现代码

创建自定义定时任务类,实现Delay接口

class DelayTask implements Delayed {

    private long timeout;//任务执行时间

    private DelayQueue<DelayTask> delayQueue = new DelayQueue<>();

    /**
     * return值小于等于0时该任务执行
     *
     * @param unit
     * @return
     */
    @Override
    public long getDelay(TimeUnit unit) {
        return this.timeout - System.currentTimeMillis();
    }

    /**
     * 排序方法
     *
     * @param o
     * @return
     */
    @Override
    public int compareTo(Delayed o) {
        return (int) (this.timeout - ((DelayTask) o).timeout);
    }

    /**
     * @param task     执行的任务
     * @param delay    延迟时间
     * @param timeUtil 时间单位
     */
    public void scheduled(Runnable task, Long delay, TimeUnit timeUtil) {
        this.timeout = System.currentTimeMillis() + timeUtil.toMillis(delay);
        try {
            delayQueue.put(this);
            delayQueue.take();
            new Thread(task).start();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * @param task     执行任务
     * @param delay    延迟时间
     * @param period   执行周期
     * @param timeUtil 时间单位
     */
    public void scheduled(Runnable task, Long delay, Long period, TimeUnit timeUtil) {
        this.timeout = System.currentTimeMillis() + timeUtil.toMillis(delay);
        try {
            while (true) {
                delayQueue.put(this);
                delayQueue.take();
                new Thread(task).start();
                this.timeout = System.currentTimeMillis() + timeUtil.toMillis(period);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

写测试类

public class TimerDemo {
    public static void main(String[] args) {
        System.out.println("这是初始化时的系统时间: " + System.currentTimeMillis());
        new DelayTask().scheduled(() -> {
            System.out.println("这是自定义的定时任务,执行时间:" + System.currentTimeMillis());
        }, 5l, 10l, TimeUnit.SECONDS);
    }
}

测试自定义定时任务,测试方法中表明,在系统启动5秒后执行第一次任务,之后每隔10秒执行一次,结果如下:

在这里插入图片描述
源码见github

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值