java @async,@async异步方法

  java @async,@async异步方法

  

目录

前言1.@Async讲解2.用法2.1 同步调用2.2 异步调用3.自定义线程池

 

  

前言

异步调用与同步调用

 

  同步调用:顺序执行,通过调用返回结果再次执行下一个调用异步调用:通过调用,无需等待返回结果,执行下一个调用

  

1. @Async讲解

其@Async的注解代码如下:

 

  @Target({ElementType .类型,元素类型。方法})@Retention(RetentionPolicy .运行时)@ documented public @ interface Async { String value()default " ";}注解可以使用在类型以及方法中通过价值定义其值,默认是空

  一般这个注解需要配合@EnableAsync,起源码如下

  @Target({ElementType .TYPE })@ Retention(保留策略.运行时)@ documentated @ Import({异步配置选择器。Class })public @ interface启用异步{ Class?扩展批注批注()默认annotation . class boolean proxyTargetClass()默认值为falseAdviceMode模式()默认建议模式.代理人;int order()默认整数MAX _ VALUE}主要通过该注解放置在启动类中进行配置启动

  在启动类中添加如下:

  @ spring boot应用程序@ enableasync public类Application { public static void main(String[]args){ srping Application。运行(应用程序。class,args);}}

  

2. 用法

 

  

2.1 同步调用

从调用到返回函数结果才能执行下一步,称为同步调用

 

  服务层代码:

  公共类服务{ public void test01()抛出中断的异常{线程。睡眠(5000);System.out.println(保存日志);}}控制层代码模块:

  public class controller { @ Autowired private Service Service;@GetMapping(/test )公共字符串getTest(){ try { system。出去。println(开始);服务。测试01();System.out.println(结束);} catch(中断异常e){ e . prinstacktrace();} } }通过跳羚的启动类启动之后

  输出如下:

  开始

  //此为等待5秒钟,终端不显示也不关闭

  结束

  

2.2 异步调用

异步调用,执行函数不用等返回结果就可以执行下一步

 

  服务层代码:主要是添加了@Async注解标识这个方法

  公共类服务{ @Async public void test01()抛出中断的异常{线程。睡眠(500);System.out.println(保存日志);}}控制层代码模块:

  通过调用服务层函数

  酒馆

  lic class Controler{    @Autowired    private Service service;    @GetMapping("/test")    public String getTest(){        try{            System.out.println("开始");            service.test01();            System.out.println("结束");                    }catch(InterruptedException e){            e.prinStackTrace();        }    }    }以及在启动类中加入注解启动 @EnableAsync

  

@SpringbootApplication@EnableAsyncpublic class Application{ public static void main(String[] args){ SrpingApplication.run(Application.class, args); }}

 

  

3. 自定义线程池

对于线程池的一些基本知识可看我之前的文章:

 

  java如何正确关闭线程以及线程池(代码实践含源码分析)java线程池的创建方式详细分析(全)

  如果不指定线程池,默认使用的线程池为SimpleAsyncTaskExecutor(来一个任务就创建一个线程,不断创建线程导致CPU过高引发OOM),自带的线程池一般都有弊端,一般推荐使用ThreadPoolExecutor(明确线程池的资源,规避风险)

  具体如下:

  newFixedThreadPool:定死了线程数,任务队列还是无界的,(最大线程数只有队列满了,最大线程数才会创建),所以会造成OOMnewCachedThreadPool:没有设置最大线程数上限,创建大量的线程容易卡顿或者直接OOM通过自定义线程池可以调整线程池的配置,更好的资源利用

  @Async这个注解查找 AsyncConfigurer接口(实现类为AsyncConfigurerSupport,默认配置和方法都是空),所以可重写接口指定线程池。

  通过实现接口AsyncConfigurer继承AsyncConfigurerSupport自定义TaskExecutor(替代内置任务执行器)第三种方法:

  在application.xml中定义线程池的一些变量

  

thread.core.size=16thread.max.size=16thread.queue.size=30thread.prefix=xx-

自定义线程池如下

 

  

import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.ThreadPoolExecutor;@Configurationpublic class ThreadPoolConfig {    // 线程名称前缀    @Value("${thread.prefix}")    private String threadPrefix;        // 核心线程数    @Value("${thread.core.size}")    private int coreSize;    // 最大线程数    @Value("${thread.max.size}")    private int maxSize;        // 队列长度    @Value("${thread.queue.size}")    private int queueSize;        // 通过bean注解注入    @Bean("xx")    public ThreadPoolTaskExecutor taskExecutor() {        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();        //设置线程池参数信息        taskExecutor.setCorePoolSize(coreSize);        taskExecutor.setMaxPoolSize(maxSize);        taskExecutor.setQueueCapacity(queueSize);        taskExecutor.setThreadNamePrefix(threadPrefix);        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);        taskExecutor.setAwaitTerminationSeconds(30);                //修改拒绝策略为使用当前线程执行        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());                //初始化线程池        taskExecutor.initialize();        return taskExecutor;    }}

到此这篇关于关于java中@Async异步调用详细解析附代码的文章就介绍到这了,更多相关java @Async异步调用内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: