定时任务

本文详细介绍Java中定时任务的多种实现方式,包括Thread、TimerTask、线程池、Quartz等,探讨了每种方法的特点及应用场景,为开发者提供全面的技术指南。

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

定时任务

定时任务场景:

  数据同步,交易信息,定时发送数据,活动推送 

  主题:分布式任务调度平台分布式领域中集群的话,保证定时Job幂等性   

 

Java定时job方案:

  Thread  TimerTast 线程池 quartz SpringBoot 内置schedul

1、Thread:

package com.toov5.JobTest;

public class Demo01 {
   
    static long count = 0;
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            
            @Override
            public void run() {
            while (true) {
                try {
                    Thread.sleep(1000);
                    count++;
                    System.out.println(count);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
                
            }
        };
        
        Thread thread = new Thread(runnable);
        thread.start();
    }
     
    
}

TimerTask

package com.toov5.JobTest;

import java.util.Timer;
import java.util.TimerTask;

public class Demo02 {
    
    private static int count = 0;
    
    public static void main(String[] args) {
        //属于JDK自带的 util包里的哦
    TimerTask timerTask    = new TimerTask() {
            
            @Override
            public void run() {
                System.out.println(++count); 
                
            }
        };
        //定义触发规则
        Timer timer = new Timer();
        //天数
        long delay = 0;  //0表示任意的
        long period = 1000;
        timer.scheduleAtFixedRate(timerTask, delay, period);
    }
    
}

线程池:

package com.toov5.JobTest;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Demo03 {
    private static int count = 0;

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {

            @Override
            public void run() {
                System.out.println(++count);

            }
        };
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        service.scheduleAtFixedRate(runnable, 1, 1, TimeUnit.SECONDS);

    }

}

Quartz: http://cron.qqe2.com/

package com.toov5.quartz;

import java.util.Date;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class TestJob {
     public static void main(String[] args) throws SchedulerException {
         //1.创建Scheduler的工厂
         SchedulerFactory sf = new StdSchedulerFactory();
         //2.从工厂中获取调度器实例
         Scheduler scheduler = sf.getScheduler();


         //3.创建JobDetail  Job的详细信息  制定哪个job的
         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() + 3*1000L; //3秒后启动任务
         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();

    }
}

要跑的业务:

package com.toov5.quartz;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class MyJob implements Job {
    public void execute(JobExecutionContext context) throws JobExecutionException {
        //定时任务的 业务
        System.out.println("quartz MyJob date:" + new Date().getTime());
    }
}

每隔2s执行一次:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值