SpringBoot几种定时任务的实现方式 和多线程执行任务

定时任务实现的几种方式:

  • Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。
  • ScheduledExecutorService:也jdk自带的一个类;是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。
  • Spring Task:Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。
  • Quartz:这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。

下面说的是 spring自带的定时任务。

SpringBoot使用注解方式开启定时任务添加注解方式

开发中定时任务,要和别的业务类分开写。这样处理起来方便。

1)启动类里面 @EnableScheduling开启定时任务,自动扫描
2)定时任务业务类 加注解 @Component被容器扫描
3)定时执行的方法加上注解 @Scheduled(fixedRate=2000) 定期执行一次

@SpringBootApplication //一个注解顶下面3个@EnableScheduling  //开启定时任务@EnableAsync   //开启异步任务public class XdclassApplication {

public static void main(String[] args) {      SpringApplication.run(XdclassApplication.class, args);   }}

//定时任务类
@Componentpublic class AsyncTask {   @Scheduled(fixedRate=2000)   public void task1() throws InterruptedException{      long begin = System.currentTimeMillis();      Thread.sleep(1000L);      long end = System.currentTimeMillis();      System.out.println("任务1耗时="+(end-begin));   }   public void task2() throws InterruptedException{      long begin = System.currentTimeMillis();      Thread.sleep(2000L);      long end = System.currentTimeMillis();      System.out.println("任务2耗时="+(end-begin));   }   //定时任务需要返回值的情况   public Future<String> task4() throws InterruptedException{      long begin = System.currentTimeMillis();      Thread.sleep(2000L);      long end = System.currentTimeMillis();      System.out.println("任务4耗时="+(end-begin));      return new AsyncResult<String>("任务4");   }   public Future<String> task5() throws InterruptedException{      long begin = System.currentTimeMillis();      Thread.sleep(3000L);      long end = System.currentTimeMillis();      System.out.println("任务5耗时="+(end-begin));      return new AsyncResult<String>("任务5");   }

SpringBoot2.x异步任务实战(核心知识) 不一定是要和上面的定时任务一起使用还有很多场景的。需要异步处理的任务,最好单独的封装在一个类中。这样好处理。
简介:讲解什么是异步任务,和使用SpringBoot2.x开发异步任务实战
1、什么是异步任务和使用场景:适用于处理log、发送邮件、短信……等
下单接口->查库存 100
余额校验 150
风控用户100

2、启动类里面使用@EnableAsync注解开启功能,自动扫描

3、定义异步任务类并使用@Component标记组件被容器扫描,异步方法加上@Async
注意点:
1)要把异步任务封装到类里面,不能直接写到Controller
2)增加Future<String> 返回结果 AsyncResult<String>("task执行完成");
3)如果需要拿到结果 需要判断全部的 task.isDone()
4、通过注入方式,注入到controller里面,如果测试前后区别则改为同步则把Async注释掉

@Component@Asyncpublic class AsyncTask {   @Scheduled(fixedRate=2000)   public void task1() throws InterruptedException{      long begin = System.currentTimeMillis();      Thread.sleep(1000L);      long end = System.currentTimeMillis();      System.out.println("任务1耗时="+(end-begin));   }   public void task2() throws InterruptedException{      long begin = System.currentTimeMillis();      Thread.sleep(2000L);      long end = System.currentTimeMillis();      System.out.println("任务2耗时="+(end-begin));   }   //定时任务需要返回值的情况   public Future<String> task4() throws InterruptedException{      long begin = System.currentTimeMillis();      Thread.sleep(2000L);      long end = System.currentTimeMillis();      System.out.println("任务4耗时="+(end-begin));      return new AsyncResult<String>("任务4");   }   public Future<String> task5() throws InterruptedException{      long begin = System.currentTimeMillis();      Thread.sleep(3000L);      long end = System.currentTimeMillis();      System.out.println("任务5耗时="+(end-begin));      return new AsyncResult<String>("任务5");   }}
@GetMapping("async_task")public JsonData exeTask() throws InterruptedException{

long begin = System.currentTimeMillis();

Future<String> task4 = task.task4();   Future<String> task5 = task.task5();   for(;;){      if (task4.isDone() && task5.isDone() ) {         break;      }   }

long end = System.currentTimeMillis();

long total = end-begin;   System.out.println("执行总耗时="+total);   return JsonData.buildSuccess(total);}

原文地址:https://www.cnblogs.com/xiaowangbangzhu/p/10321238.html

时间: 2024-07-30 20:42:06

SpringBoot几种定时任务的实现方式 和多线程执行任务的相关文章

SpringBoot几种定时任务的实现方式

原文地址:SpringBoot几种定时任务的实现方式 定时任务实现的几种方式: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行.一般用的较少. ScheduledExecutorService:也jdk自带的一个类:是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响. Spring Tas

SpringBoot三种启动方式

SpringBoot第一种启动方式 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.

SpringBoot中并发定时任务的实现、动态定时任务的实现(看这一篇就够了)

# 一.在JAVA开发领域,目前可以通过以下几种方式进行定时任务 1.单机部署模式 Timer:jdk中自带的一个定时调度类,可以简单的实现按某一频度进行任务执行.提供的功能比较单一,无法实现复杂的调度任务. ScheduledExecutorService:也是jdk自带的一个基于线程池设计的定时任务类.其每个调度任务都会分配到线程池中的一个线程执行,所以其任务是并发执行的,互不影响. Spring Task:Spring提供的一个任务调度工具,支持注解和配置文件形式,支持Cron表达式,使用

SpringBoot:实现定时任务

一.定时任务实现的几种方式: Timer 这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行.一般用的较少. ScheduledExecutorService 也jdk自带的一个类:是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响. Spring Task Spring3.0以后自带的task,可以将它

SpringBoot的读取properties文件的方式

转载:https://www.imooc.com/article/18252一.@ConfigurationProperties方式 自定义配置类:PropertiesConfig.java package com.zyd.property.config; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import java.util.List;

Javascript学习笔记:3种定义函数的方式

①使用函数声明语法定义函数 1 function sum(num1,num2){ 2 return num1+num2; 3 } ②使用函数表达式定义函数 1 var sum=function(num1,num2){ 2 return num1+num2; 3 } ③使用Function构造函数定义函数 1 var sum=new Function('num1','num2','return num1+num2'); 三种定义函数的方式,其中第二和第三种从技术角度讲都属于函数表达式的方式,但是不

oc/object-c/ios哪种遍历NSArray/NSDictionary方式快?测试报告

做app的时候,总免不了要多次遍历数组或者字典.究竟哪种遍历方式比较快呢?我做了如下测试:首先定义测试用宏: ? 1 2 3 4 5 6 7 8 9 #define MULogTimeintervalBegin(INFO) NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];\ NSTimeInterval duration = 0;\ NSLog(@"MULogTimeintervalBegin:%@", IN

两种访问接口的方式(get和post)

跨机器.跨语言的远程访问形式一共有三种:scoket发送数据包.http发送请求.rmi远程连接: http发送请求方式:分为post和get两种方式 importjava.io.IOException; importjava.io.InputStream; import java.util.Map; importjava.util.concurrent.atomic.AtomicInteger; importorg.apache.commons.httpclient.HttpClient; i

javascript两种声明函数的方式的一次深入解析

声明函数的方式 javascript有两种声明函数的方式,一个是函数表达式定义函数,也就是我们说的匿名函数方式,一个是函数语句定义函数,下面看代码: /*方式一*/ var FUNCTION_NAME = function() { /* FUNCTION_BODY */}; /*方式二*/ function FUNCTION_NAME () { /* FUNCTION_BODY */}; 区别一 方式一的声明方式是先声明后使用 方式二的声明方式可以先调用,后声明 /*方式一: *先声明后使用 *