在原生java中,创建和启动线程的方式大致有以下几种:

  1. 继承Thread类,然后重写run方法
  2. 实现Runnable接口,并重写run方法
  3. 匿名内部类
 Thread thread = new Thread(new Runnable() {@Overridepublic void run() {// 线程实现}});thread.start();
  1. lambda表达式
  new Thread(()->{// 线程实现}).start();

在springboot中,推荐使用线程池的方式来管理多线程。
首先,添加配置类:

@Configuration
@EnableAsync
public class ThreadPoolConfig {/*** 核心线程池大小50*/private static final int CORE_POOL_SIZE = 10;/*** 最大可创建的线程数200*/private static final int MAX_POOL_SIZE = 10;/*** 队列最大长度1000*/private static final int QUEUE_CAPACITY = 10;/*** 线程池维护线程所允许的空闲时间300*/private static final int KEEP_ALIVE_SECONDS = 300;/*** 异步执行方法线程池** @return*/@Bean(name = "asyncExecutor")public ThreadPoolTaskExecutor eventExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setMaxPoolSize(MAX_POOL_SIZE);executor.setCorePoolSize(CORE_POOL_SIZE);executor.setQueueCapacity(QUEUE_CAPACITY);executor.setKeepAliveSeconds(KEEP_ALIVE_SECONDS);// 线程池对拒绝任务(无线程可用)的处理策略executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return executor;}
}

这里需要特别注意类上的两个注解,@Configuration声明当前类为一个配置类,@EnableAsync开启对异步任务的支持。
接着,在service实现方法上添加注解@Async("asyncExecutor"),这里的asyncExecutor对应config里面的执行器名称。

关于添加了@Async注解,但是没事异步执行线程方法的情况貌似还有点多,主要是大家没有按照规范来使用,或者没有注意到一些细节点。
下面总结一些常见的易错点:

  1. 添加@EnableAsync注解,开启异步任务支持
  2. 异步方法必须是public且void(或Future)
  3. 异步方法所在的类必须添加@Component或者其它注解,加入到容器中
  4. 调用者与被调用者在同一个类中,且直接调用。这种情况和spring的事务一样,都是通过aop实现的,所以一定要用代理类的方法才能够实现。如果调用者和被调用者都在同一个类中,使用spring上下文,获取到对应的代理类再执行异步方法。

springboot如何使用多线程,线程池管理相关推荐

  1. 【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

      springboot篇章整体栏目:  [一]springboot整合swagger(超详细 [二]springboot整合swagger(自定义)(超详细) [三]springboot整合toke ...

  2. JAVA线程池管理及分布式HADOOP调度框架搭建

    平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发攻城师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式 ...

  3. 【转】1.2异步编程:使用线程池管理线程

    从此图中我们会发现 .NET 与C# 的每个版本发布都是有一个"主题".即:C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语言→C#5.0异步编程.现在我为 ...

  4. 异步编程:使用线程池管理线程

    开始<异步编程:使用线程池管理线程> 示例程序:异步编程:使用线程池管理线程.rar 如今的应用程序越来越复杂,我们常常需要使用<异步编程:线程概述及使用>中提到的多线程技术来 ...

  5. 多线程线程池的实现java_如何在Java中实现线程池

    多线程线程池的实现java 线程是独立程序的执行路径. 在java中,每个线程都扩展java.lang.Thread类或实现java.lang.Runnable. 多线程是指在一个任务中同时执行两个或 ...

  6. 多线程线程池的基本创建,使用方法

    import java.util.concurrent.*;/*** 多线程线程池的基本创建,使用方法** @author silence*/ public class Silence {public ...

  7. Android多线程操作——线程池管理综述

    1 前言 android开发,大家最熟悉的肯定是主线程,也就是ui线程,也都知道在非ui线程更新界面会报错提示不允许在子线程更新ui.但是耗时操作还是需要使用子线程,如: new Thread(new ...

  8. java搭建线程池框架,JAVA线程池管理及分布式HADOOP调度框架搭建

    大家看到了线程的好处了吧!单线程需要10S,10个线程只需要1S.充分利用了系统资源实现并行计算.也许这里会产生一个误解,是不是增加的线程个数越多效率越高.线程越多处理性能越高这个是错误的,范式都要合 ...

  9. Java多线程 线程池Executor框架

    目录 一.说明 二.理解 Executor ExecutorService Executors 三.实现 1. newSingleThreadExecutor 2. newFixedThreadPoo ...

最新文章

  1. 她是直播聊学习成“网红”的北大博士,毕业后入职民办学校,年薪70万
  2. 边缘计算 — 商业模式
  3. 《OpenGL编程指南》一第2章 着色器基础
  4. C#中的委托,匿名方法和Lambda表达式
  5. 阿里Java开发规约(2)
  6. 网页效果图设计之色彩索引
  7. OpenGL-渲染管线的流程(有图有真相)
  8. 004_Spring Data JPA根据实例查询数据
  9. 意想不到的有趣linux命令
  10. PyQt:成功解决PyQt4升级到PyQt5改变的函数或方法
  11. SQL:使用 CASE
  12. 从操作系统的PV操作理解JAVA的synchronized同步方法,同步代码块实现,及比较
  13. 独轮车(广搜_队列)
  14. MySQL 基数的定义
  15. CnForums1.0 Alpha RC1 发布
  16. 如何选择HR人事管理软件?HR人事管理系统软件有哪些
  17. java sockets_Java Sockets
  18. 掌上题库V1.2.2全开源版本
  19. 直播软件开发公司来告诉你什么是互动直播
  20. 如何平衡新老策略的好与坏,一道常见风控送命题解答

热门文章

  1. 保护REST API / Web服务的最佳实践[关闭]
  2. win11搜索位置在哪 Windows11搜索位置的设置方法
  3. 基于TCP协议的Socket通信,实现文件断点续传
  4. Linux下nginx的安装及部署
  5. 监管大屏系统_“警视” 警务情指一体大屏可视化决策系统
  6. java 协议开发_用Java的NIO开发网络协议
  7. 文本属性之文本颜色(CSS、HTML)
  8. MySQL安装教程及配置环境变量(建议收藏)
  9. 游戏本自动掉帧_机 · 科普帖丨如何在夏天告别游戏掉帧的问题
  10. android 8.0 以后 uiautomator 无法直接使用的问题