博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
创建定时任务的 5 种方式
阅读量:4104 次
发布时间:2019-05-25

本文共 3775 字,大约阅读时间需要 12 分钟。

一、简介

定时任务的解释为周期性地执行特定的任务,比如我们所熟悉的闹钟,传统单机形式的常用解决方案有多线程、TimeTask、线程池、SpringBoot 注解、Quartz 等方案,下面我们先来事件一下这几种方案,在分布式集群条件下的解决方案,我们将在后续的文章中进行讲解。,

二、解决方案示例

1、多线程

我们只需要执行一个子线程,然后每隔一段时间执行就 OK 了。

public class ThreadTask {    public static void main(String[] args) {        new Thread(new Runnable() {            @Override            public void run() {                while (true) {                    try {                        Thread.sleep(1000);                        System.out.println("定时任务执行》》》"+new Date());                    } catch (InterruptedException e) {                    }                }            }        }).start();    }}
2、线程池
public class ScheduledExecutorServicTask {    public static void main(String[] args) {                Runnable runnable = new Runnable() {            public void run() {                System.out.println("定时任务执行》》》"+new Date());            }        };        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);        scheduledExecutorService.scheduleAtFixedRate(runnable, 1, 1, TimeUnit.SECONDS);    }}

我们可以选择两种方式创建线程池,区别在于是单一线程还是多个线程处理。

Executors.newSingleThreadScheduledExecutor();
Executors.newScheduledThreadPool(10);
3、SpringBoot 注解

启动类添加注解,如下

@SpringBootApplication@EnableSchedulingpublic class JavaJobApplication {	public static void main(String[] args) {		SpringApplication.run(JavaJobApplication.class, args);	}}
@Componentpublic class SpringBootScheduled {    @Scheduled(cron = "0/1 * * * * ?")    public void scheduledTask() {        System.out.println("定时任务执行》》》" + new Date());    }}

cron 的数字含义为 :秒/分/小时/日/月/周

秒(0~59) 例如 0/1 表示每 1 秒

分(0~59)
时(0~23)
日(0~31)的某天,需计算
月(0~11)
周几(可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT,问号表示不关心是第几周,也可以设置为 *)

更多配置详情参考:https://www.jianshu.com/p/1defb0f22ed1

4、TimeTask

Java 提供的实现定时任务的方式

public class TimeTaskSchedule {    public static void main(String[] args) {        TimerTask timerTask = new TimerTask() {            @Override            public void run() {                System.out.println("定时任务执行》》》" + new Date());            }        };        Timer timer = new Timer();        //延迟多少时间后开始执行        long delay = 0;        //每隔多少时间执行,这里是 1 秒        long period = 1000;        timer.scheduleAtFixedRate(timerTask, delay, period);    }}
5、Quartz

由 Java 开发的一个实现定时任务的框架

public class MyJob implements Job{    @Override    public void execute(JobExecutionContext context) throws JobExecutionException {        System.out.println("定时任务执行》》》" + new Date());    }}
public class QuartzTest {    public static void main(String[] args) throws SchedulerException {        //1.创建Scheduler的工厂        SchedulerFactory sf = new StdSchedulerFactory();        //2.从工厂中获取调度器实例        Scheduler scheduler = sf.getScheduler();        //3.创建 JobDetail        JobDetail jb = JobBuilder.newJob(MyJob.class)                .withDescription("this is a ram job") //job的描述                .withIdentity("ramJob", "ramGroup") //job 的 name 和 group                .build();        //任务运行的时间,SimpleSchedle 类型触发器有效        long time = System.currentTimeMillis() + 2 * 1000L; //2 秒后启动任务        Date statTime = new Date(time);        //4.创建Trigger        //使用SimpleScheduleBuilder或者CronScheduleBuilder        Trigger t = TriggerBuilder.newTrigger()                .withDescription("")                .withIdentity("ramTrigger", "ramTriggerGroup")                //.withSchedule(SimpleScheduleBuilder.simpleSchedule())                .startAt(statTime)  //默认当前时间启动                .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) //两秒执行一次                .build();        //5.注册任务和定时器        scheduler.scheduleJob(jb, t);        //6.启动 调度器        scheduler.start();    }}

官方文档:https://www.w3cschool.cn/quartz_doc/quartz_doc-2put2clm.html

三、结果

在这里插入图片描述

ABOUT

公众号:【星尘Pro】

github:

推荐阅读

转载地址:http://jffsi.baihongyu.com/

你可能感兴趣的文章
异常 Java学习Day_15
查看>>
JavaSE_day_03 方法
查看>>
day-03JavaSE_循环
查看>>
Mysql初始化的命令
查看>>
day_21_0817_Mysql
查看>>
day-22 mysql_SQL 结构化查询语言
查看>>
MySQL关键字的些许问题
查看>>
浅谈HTML
查看>>
css基础
查看>>
HTML&CSS进阶
查看>>
Servlet进阶和JSP基础
查看>>
servlet&jsp 的使用以及jsp的历史遗留用法
查看>>
servlet中的cookie和session
查看>>
过滤器及JSP九大隐式对象
查看>>
软件(项目)的分层
查看>>
菜单树
查看>>
MySQL-分布式架构-MyCAT
查看>>
设计模式六大原则(6):开闭原则
查看>>
阿里面试总结--JAVA
查看>>
Servlet的生命周期
查看>>