本文共 3775 字,大约阅读时间需要 12 分钟。
定时任务的解释为周期性地执行特定的任务,比如我们所熟悉的闹钟,传统单机形式的常用解决方案有多线程、TimeTask、线程池、SpringBoot 注解、Quartz 等方案,下面我们先来事件一下这几种方案,在分布式集群条件下的解决方案,我们将在后续的文章中进行讲解。,
我们只需要执行一个子线程,然后每隔一段时间执行就 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(); }}
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);
启动类添加注解,如下
@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
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); }}
由 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
公众号:【星尘Pro】
github:
推荐阅读
转载地址:http://jffsi.baihongyu.com/