spring常用注解(八)@Async

一、介绍

1、介绍

二、原理

三、集成与使用

1、集成方法

(1)开启

使用以下注解开启

@EnableAsync

(2)使用

在需要异步处理的方法上加上

@Async
2、返回值
@Async注解的方法返回值只能为void或者Future<T>。

(1)无返回值

(2)有返回值

使用AsyncResult包装下得到Future对象返回;调用处使用get方法获取。

3、demo
(1)初始化线程池

如我初始化了两个,分别在user模块、order模块使用

package com.demo.thread.constant;

public class ThreadPoolConstant {

    public static final String USER_POOL = "userPool";

    public static final String ORDER_POOL = "orderPool";
}
package com.demo.thread.config;

import com.demo.thread.constant.ThreadPoolConstant;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration
@EnableAsync
public class ThreadPoolTaskExecutorConfig {
    private static int CORE_POOL_SIZE = 5;
    private static int MAX_POOL_SIZE = 10;

    @Bean(name= ThreadPoolConstant.USER_POOL)
    public ThreadPoolTaskExecutor userTaskExecutor(){
        ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
        //线程池维护线程的最少数量
        poolTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
        //线程池维护线程的最大数量
        poolTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
        //线程池所使用的缓冲队列
        poolTaskExecutor.setQueueCapacity(200);
        //线程池维护线程所允许的空闲时间
        poolTaskExecutor.setKeepAliveSeconds(30000);
        poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        poolTaskExecutor.setBeanName(ThreadPoolConstant.USER_POOL);
        return poolTaskExecutor;
    }

    @Bean(name= ThreadPoolConstant.ORDER_POOL)
    public ThreadPoolTaskExecutor orderTaskExecutor(){
        ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
        //线程池维护线程的最少数量
        poolTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
        //线程池维护线程的最大数量
        poolTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
        //线程池所使用的缓冲队列
        poolTaskExecutor.setQueueCapacity(200);
        //线程池维护线程所允许的空闲时间
        poolTaskExecutor.setKeepAliveSeconds(30000);
        poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        poolTaskExecutor.setBeanName(ThreadPoolConstant.ORDER_POOL);
        return poolTaskExecutor;
    }
}
(2)service
package com.demo.thread.service.impl;

import com.demo.thread.constant.ThreadPoolConstant;
import com.demo.thread.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Future;

@Service("userService")
@Slf4j
public class UserServiceImpl implements UserService {

    @Override
    @Async(ThreadPoolConstant.USER_POOL)
    public void create()  {
        log.info("user create开始...");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        log.info("user create结束...");
    }

    @Override
    @Async(ThreadPoolConstant.USER_POOL)
    public Future<List<String>> query()  {
        log.info("user query 开始...");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        List<String> userIds = new ArrayList<>();
        userIds.add("zs");
        userIds.add("ls");
        Future<List<String>> users = new AsyncResult(userIds);
        log.info("user query 结束...");
        return users;
    }
}
(3)controller
package com.demo.thread.controller;

import com.demo.thread.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

@RestController
@RequestMapping("/test")
@Slf4j
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/create")
    public void create() {
        log.info("测试create开始");
        userService.create();
        log.info("测试create结束");
    }

    @RequestMapping("/query")
    public void query() {
        log.info("测试query开始");
        Future<List<String>> users = userService.query();
        log.info("调用query结束");
        try {
            List<String> userIds = users.get();
            log.info("query结果为:{}",userIds);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }
        log.info("测试query结束");
    }
}
(4)启动类
package com.demo.thread;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ThreadApplicationStart {
    public static void main(String[] args) {
        SpringApplication.run(ThreadApplicationStart.class, args);
    }
}
(5)测试

无返回值:访问localhost:8080/test/create控制台输出:

有返回值:访问localhost:8080/test/query控制台输出:可以看到feture取结果会阻塞主线程,其他则按执行顺序打印

相关推荐

  1. Spring注解!!!

    2024-06-12 13:02:03       46 阅读
  2. spring 注解

    2024-06-12 13:02:03       7 阅读
  3. Spring Boot注解

    2024-06-12 13:02:03       41 阅读
  4. Spring框架注解

    2024-06-12 13:02:03       32 阅读
  5. spring注解

    2024-06-12 13:02:03       9 阅读
  6. Spring Boot 注解

    2024-06-12 13:02:03       8 阅读
  7. Spring Boot注解

    2024-06-12 13:02:03       6 阅读

最近更新

  1. 什么是DNS欺骗

    2024-06-12 13:02:03       0 阅读
  2. leetcode hot 100 刷题记录

    2024-06-12 13:02:03       0 阅读
  3. 全面解析C#:现代编程语言

    2024-06-12 13:02:03       0 阅读
  4. 【深入探索】揭秘SQL Server的多重身份验证模式

    2024-06-12 13:02:03       1 阅读
  5. 短链接day3

    2024-06-12 13:02:03       1 阅读
  6. [C++基础]C++ 10个常用案例

    2024-06-12 13:02:03       1 阅读
  7. android paddingStart paddingLeft 使用区别

    2024-06-12 13:02:03       1 阅读
  8. 【ARMv8/v9 GIC 系列 5.7 -- 中断路由与系统寄存器】

    2024-06-12 13:02:03       1 阅读
  9. python在人工智能领域中的应用

    2024-06-12 13:02:03       1 阅读
  10. 互联汽车的RF挑战和解决方案

    2024-06-12 13:02:03       1 阅读

热门阅读

  1. ffmpeg的部署踩坑及简单使用方式

    2024-06-12 13:02:03       9 阅读
  2. win10下 mysql8.0.37.0 msi版本安装时出现的问题

    2024-06-12 13:02:03       8 阅读
  3. windows下安装IntelliJIDEA

    2024-06-12 13:02:03       12 阅读
  4. 【实用技巧】Unity中的Scrollbar组件的实用技巧

    2024-06-12 13:02:03       8 阅读
  5. 在 Jupyter 编辑函数(Edit function in Jupyter)

    2024-06-12 13:02:03       6 阅读
  6. 《计算机组成原理》期末复习题节选

    2024-06-12 13:02:03       5 阅读
  7. C# range

    2024-06-12 13:02:03       9 阅读
  8. git使用http协议时免密pull和push方法

    2024-06-12 13:02:03       7 阅读
  9. nginx的rewrite功能介绍

    2024-06-12 13:02:03       7 阅读