关于定时任务,看着一系列就够了——5.JDK 线程+sleep 实现定时任务

简介: JDK 线程+sleep 实现简单的定时任务

一、简介

使用Thread类可以做简单的定时任务,主要思路是创建一个无限循环的线程,使用sleep来进行时间间隔。
调度器Scheduler:创建的Thread类在就是调度器;
触发器Trigger:sleep的睡眠时间就是触发器,触发规则;
执行器executors:线程内执行的方法;

二、示例代码

public class MainApp {

    public static void main(String[] args) {
        init();
    }

    public static void init() {
        new Thread(() -> {
            while (true) {
                try {
                    System.out.println(new Date()+" JAVA实现定时任务,每一分钟执行一次!");
                    Thread.sleep(1000 * 60 * 1);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

三、总结

使用Thread类可以做最简单的定时任务,在run方法中有个while的死循环(当然还有其他方式),执行我们自己的任务。有个需要特别注意的地方是,需要用try...catch捕获异常,否则如果出现异常,就直接退出循环,下次将无法继续执行了。

这种方式做的定时任务,只能周期性执行,不能支持定时在某个时间点执行(即使修改添加一些代码能实现,也不建议使用Thread去实现固定时间的定时)。
此外,该线程可以定义成守护线程,在后台默默执行就好。
使用场景:比如项目中有时需要每隔10分钟去聚合一次数据,每过3分钟检查一下状态,每个一天统计一天的数据生产报表等,一些简单的周期性任务场景。
使用Thread类的优缺点
优点:这种定时任务非常简单,学习成本低,容易入手,对于那些简单的周期性任务,是个不错的选择,主要是时候自己做demo或者执行一些简单的任务,不建议用于工作项目中。
缺点:不支持指定某个时间点执行任务,不支持延迟执行等操作,如果任务执行时间过长也没用其他机制来保证任务的运行,功能过于单一,无法应对一些较为复杂的场景。

相关文章
|
4月前
|
Java 调度 Spring
SpringBoot实现多线程定时任务动态定时任务配置文件配置定时任务
SpringBoot实现多线程定时任务动态定时任务配置文件配置定时任务
404 0
|
4月前
|
Java 调度 开发者
JDK 21中的虚拟线程:轻量级并发的新篇章
本文深入探讨了JDK 21中引入的虚拟线程(Virtual Threads)概念,分析了其背后的设计哲学,以及与传统线程模型的区别。文章还将讨论虚拟线程如何简化并发编程,提高资源利用率,并展示了一些使用虚拟线程进行开发的示例。
|
4月前
|
缓存 安全 Java
JDK8线程池BUG引发的思考
JDK8线程池BUG引发的思考
134 0
|
4月前
|
存储 缓存 并行计算
【面试问题】JDK并发类库提供的线程池实现有哪些?
【1月更文挑战第27天】【面试问题】JDK并发类库提供的线程池实现有哪些?
|
10月前
|
算法 安全 Java
【Java】JDK 21中的虚拟线程以及其他新特性
【Java】JDK 21中的虚拟线程以及其他新特性
191 0
|
10月前
|
监控 安全
并发编程系列教程(06) - 多线程之间通讯(wait、notify、sleep、Lock锁、Condition)
并发编程系列教程(06) - 多线程之间通讯(wait、notify、sleep、Lock锁、Condition)
52 0
|
7天前
|
监控 数据可视化 Java
使用JDK自带的监控工具JConsole来监控线程池的内存使用情况
使用JDK自带的监控工具JConsole来监控线程池的内存使用情况
|
28天前
|
缓存 Java 调度
【Java 并发秘籍】线程池大作战:揭秘 JDK 中的线程池家族!
【8月更文挑战第24天】Java的并发库提供多种线程池以应对不同的多线程编程需求。本文通过实例介绍了四种主要线程池:固定大小线程池、可缓存线程池、单一线程线程池及定时任务线程池。固定大小线程池通过预设线程数管理任务队列;可缓存线程池能根据需要动态调整线程数量;单一线程线程池确保任务顺序执行;定时任务线程池支持周期性或延时任务调度。了解并正确选用这些线程池有助于提高程序效率和资源利用率。
34 2
【多线程面试题九】、说一说sleep()和wait()的区别
sleep()和wait()的主要区别在于sleep()是Thread类的静态方法,可以在任何地方使用且不会释放锁;而wait()是Object类的方法,只能在同步方法或同步代码块中使用,并会释放锁直到相应线程通过notify()/notifyAll()重新获取锁。
|
1月前
|
算法 Java
JDK版本特性问题之想控制 G1 垃圾回收器的并行工作线程数量,如何解决
JDK版本特性问题之想控制 G1 垃圾回收器的并行工作线程数量,如何解决