首页 > 编程语言 >java - @Async 具体使用

java - @Async 具体使用

时间:2022-09-22 14:14:48浏览次数:110  
标签:线程 java import org springframework 具体 executor Async public

1.开启  @Async 异步能力

添加注解 @EnableAsync ,可以放在启动类上,也可以在任意配置类上,因为我是需要配置自定义线程池,因此放在配置类上

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

//开启异步线程能力
@EnableAsync
@Configuration
public class AsyncConfig implements AsyncConfigurer {
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 核心线程数
        executor.setCorePoolSize(10);
        // 最大线程数
        executor.setMaxPoolSize(20);
        // 队列大小
        executor.setQueueCapacity(1000);
        // 线程最大空闲时间
        executor.setKeepAliveSeconds(300);
        // 指定用于新创建的线程名称的前缀。
        executor.setThreadNamePrefix("async-cenxi-Executor-");
        // 拒绝策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 这一步千万不能忘了,否则报错: java.lang.IllegalStateException: ThreadPoolTaskExecutor not initialized
        executor.initialize();
        return executor;
    }
}

2.使用

如果在同一个类中使用方法,需要先获取该方法的类的代理类,不能直接待用,如果直接调用,效果为同步操作

这里封装个获取代理类的工具类

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringApplicationUtil implements ApplicationContextAware {
    private static ApplicationContext ctx = null;

    public SpringApplicationUtil() {
    }

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (ctx == null) {
            ctx = applicationContext;
        }
    }

    public static ApplicationContext getApplicationContext() {
        return ctx;
    }

    public static <T> T getBean(Class<T> requiredType) {
        return ctx.getBean(requiredType);
    }

    public static <T> T getBean(String name, Class<T> requiredType) {
        return ctx.getBean(name, requiredType);
    }
}
View Code

使用写法如下

SpringApplicationUtil.getBean(【方法的类名】.class).【需要调用的异步方法】();

例子

 

 

 不在同一个类中调用方法,直接在方法上加 后 ,在需要调用的地方注入类接口

 

3.有个bug,子线程无法获取主线程的参数或者http请求参数,怎么办?下面可以解决

解决

在调用子线程方法之前,设置请求上下文为继承配置即可,加入下面这句指令即可。

每个主线程只需要设置一次即可,因此应该在最开头的地方设置,因此设置位置看项目具体需要

RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);

4.有个解决不了的bug

当主线程完全结束后,HttpServletRequest 获取不到数据,为null ,因此会发现有时候能获取到值,有时候为nul ,这就是谁先谁后的原因导致的

因此,对于传参,应该获取到静态值后传入异步函数中,如果仍不满足要求,那只能启用该方式了

 

标签:线程,java,import,org,springframework,具体,executor,Async,public
From: https://www.cnblogs.com/c2g5201314/p/16719029.html

相关文章

  • JAVA常用工具类
    java开发常用工具类java正则表达式的匹配包括:邮箱,手机,姓名,昵称,身份证号,银行卡号等;生成6位随机数;对url中字符串进行编码和解码;获取客户端ip地址;获取系统当前时间;生......
  • java中String的常用方法
    1、length()字符串的长度例:charchars[]={'a','b'.'c'};Strings=newString(chars);intlen=s.length();2、charAt()截取一个字符例:charch......
  • JAVA中容器设计的进化史:从白盒到黑盒,再到跻身为设计模式之一的迭代器
    大家好,又见面了。在我们的项目编码中,不可避免的会用到一些容器类,我们可以直接使用List、Map、Set、Array等类型。当然,为了体现业务层面的含义,我们也会根据实际需要自行封......
  • Java SE 19 新增特性
    JavaSE19新增特性作者:Grey原文地址:博客园:JavaSE19新增特性CSDN:JavaSE19新增特性源码源仓库:Github:java_new_features镜像仓库:GitCode:java_new_features......
  • JavaScript 函数定义
    JavaScript使用关键字 function 定义函数。函数可以通过声明定义,也可以是一个表达式。函数声明:函数声明后不会立即执行,会在我们需要的时候调用到。functionmyFunct......
  • 学习Java Day1
    Markdown学习Day1笔记划线层级标题+空格井号的多少表示层级的大小字体粗体为文字前后输入各两个“星号”——**斜体为文字前后输入各一个“星号”——*斜体......
  • java批量采集豌豆荚网站Android应用图标和包名
    Android主题开发者做的主题,如果想代替第三方应用图标,就必须要知道应用的包名。其实想知道应用的包名很简单,直接在浏览器打开GooglePlay或豌豆荚,打开某应用的页面,看网址你......
  • JSON格式字符串与Java对象之间的转换
    0.加入allibab依赖<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version></dependency>1.JSON......
  • Java 加载、编辑和保存WPS表格文件(.et/.ett)
    WPS表格文件是金山开发的专门用于处理表格数据的Office工具,属于WPSOffice中WPS文字、WPS表格和WPS演示三大功能模块之一。通常以.et和.ett作为文件后缀。我们在通过后端来......
  • java超大文件上传和断点续传的实现
    ​我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。首先我们需要了解的是上传文件三要素:1.表单提交方式:p......