JavaSE实现任务调度的三种方式(十六)

简介: JavaSE实现任务调度的三种方式(十六)

一. 为什么要出现定时任务?


在实际生活和开发中,常常会遇到类似的情况, 如 1.女朋友生日那一天,发送定时消息,提醒生日快乐 2. 给某人写邮件编写好内容之后,在晚上10点时准时发送, 3 某天固定8点起床,晚上10点睡觉 4.母亲节,父亲节时给父母发送消息。 等生活中的定时小例子 (闹钟,备忘录都属于定时)。


开发中,1. 给已经注册的用户,在用户生日那天,发送生日祝福. 2. 公司员工,当入职满一年时,增加年假至5天,入职5年时,增加年假至10天。 3.定时删除三个月前的日志记录消息。 4. 定时监测网站访问情况等开发中的定时小例子。


这些生活和开发实例,都属于定时任务。 定时任务,是很常见的,也是很重要的。


JavaSE 阶段提供了 三种方式,来实现定时任务。


JavaEE 阶段,使用 Quartz 框架来实现定时任务。


二. JavaSE 阶段实现定时任务


二.一 多线程 Runnable 和Thread 实现定时任务

import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * 
 * Thread 多线程通过休眠时间来实现定时执行
 * @author 两个蝴蝶飞
 *
 */
public class ThreadDemo {
  public static void main(String []args){
  //定时的时间
  Long SLEEP_TIME=1000*5L;
  Runnable runnable=new Runnable() {
    @Override
    public void run() {
    while(true){
      try {
      //通过设置休眠,来达到定时的效果。 每5s执行一次 
      Thread.sleep(SLEEP_TIME);
      SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      String localeDate=sdf.format(new Date());
      System.out.println("Thread 线程:当前时间为:"+localeDate);
      } catch (InterruptedException e) {
      // TODO 自动生成的 catch 块
      e.printStackTrace();
      }
    }
    }
  };
  Thread thread=new Thread(runnable);
  thread.start();
  }
}


控制台打印输出:

image.png



如果想取消定时的话, 可以定义一个全局常量flag,flag默认是true, 将 while(true) 改成 while(flag), 当取消定时时,将flag 由true 改成false 即可。

二.二 TimerTask 和 Timer 实现定时任务

二.二.一 代码编写

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/**
 * 
 * TimerTask 和Timer 实现定时任务
 * @author 两个蝴蝶飞
 *
 */
public class TaskDemo {
  public static void main(String[] args) {
  Timer timer=new Timer();
  TimerTask task=new TimerTask() {  
    @Override
    public void run() {
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String localeDate=sdf.format(new Date());
    System.out.println("Task任务:当前时间为:"+localeDate);
    }
  };
  timer.scheduleAtFixedRate(task,0,5000);
  //调用  cancel()方法来取消定时
  //timer.cancel();
  }
}


通过调用 Timer 对象的 scheduleAtFixedRate() 方法,来实现定时任务。


控制台打印输出:

image.png

二.二.二 Timer中的调度方法

task 均为执行定时任务的对象,时间单位为 ms.


image.png


二.三 ScheduledExecutor 实现定时任务

在 java.util.concurrent 包下

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
 * ScheduledExecutor 实现定时调度
 * @author 两个蝴蝶飞
 *
 */
public class ScheduleDemo {
  public static void main(String[] args) {
  //定义定时任务
  Runnable runnable=new Runnable() {
    @Override
    public void run() {
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String localeDate=sdf.format(new Date());
    System.out.println("Scheduled调度:当前时间为:"+localeDate);
    }
  };
  //定义调度服务
  ScheduledExecutorService scheduledExecutorService=Executors.newSingleThreadScheduledExecutor();
  //运行, 哪个任务,开始时间,间隔时间,间隔单位
  scheduledExecutorService.scheduleAtFixedRate(runnable, 0, 2, TimeUnit.SECONDS);
  }
}


控制台打印输出:

image.png



三. JavaSE 实现调度的不足

上面的三种方式,虽然都实现了定时任务,但面对复杂多变的定时任务情况,就显得力不从心了。


如,


  1. 无法实现类似 ‘每年的母亲节给母亲发送祝福’,‘每个月的最后一天显示员工的本月的工作情况’,‘距离每个月10号最近的工作日发薪资’ 等非固定日期的情况。开发者不能在程序中进行判断日期。


  1. 无法与当前主流框架 Spring 进行很好的整合。


  1. 定时任务的事务处理,需要开发者自己进行处理。


  1. 定时任务持久化保存


想处理好定时任务,可以学习一下 Quartz 定时任务框架。


谢谢您的观看!!!

相关文章
|
25天前
|
XML Java 数据格式
Spring Core核心类库的功能与应用实践分析
【12月更文挑战第1天】大家好,今天我们来聊聊Spring Core这个强大的核心类库。Spring Core作为Spring框架的基础,提供了控制反转(IOC)和依赖注入(DI)等核心功能,以及企业级功能,如JNDI和定时任务等。通过本文,我们将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring Core,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
53 14
|
5月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
130 0
消息中间件 缓存 监控
160 0
|
7月前
|
设计模式 Java 开发者
解密Spring:优雅解决依赖循环的神兵利器
解密Spring:优雅解决依赖循环的神兵利器
643 57
|
4月前
|
Java 数据库连接 数据库
【Java 第十一篇章】Spring 框架介绍
Spring 是广泛用于企业级 Java 开发的开源框架,提供轻量级解决方案,助力构建灵活、可维护的应用。核心组件包括 IOC 容器、AOP、MVC、JDBC/ORM、事务处理及远程调用。依赖注入(DI)是其核心特性之一,允许容器自动管理对象间的依赖关系,提升代码的可测试性和解耦。面向切面编程(AOP)则支持将横切关注点(如日志、事务)与业务逻辑分离,促进代码复用和关注点分离。Spring 的 IoC 容器负责对象的创建和管理,简化对象的生命周期管理。Spring 框架具备低侵入性设计,易于整合主流技术栈。
32 0
|
7月前
|
Java Spring 容器
如何用基于 Java 配置的方式配置 Spring?
如何用基于 Java 配置的方式配置 Spring?
|
7月前
|
算法 NoSQL Java
8. 「Java大师」教你如何用Spring Boot轻松实现高效「限流」!
8. 「Java大师」教你如何用Spring Boot轻松实现高效「限流」!
300 0
|
缓存 Java 数据安全/隐私保护
Spring 循环依赖问题解决方案以及简要源码流程剖析
Spring 循环依赖问题解决方案以及简要源码流程剖析
125 0
|
XML Java 程序员
【框架源码】SpringBoot核心源码解读之自动配置源码分析
【框架源码】SpringBoot核心源码解读之自动配置源码分析
【框架源码】SpringBoot核心源码解读之自动配置源码分析
|
设计模式 Java Spring
【Spring】核心部分之AOP:通过列举代码例子,从底层刨析,深入源码,轻轻松松理解Spring的核心AOP,AOP有这一篇足以
【Spring】核心部分之AOP:通过列举代码例子,从底层刨析,深入源码,轻轻松松理解Spring的核心AOP,AOP有这一篇足以

相关实验场景

更多