spring threadpooltaskexecutor,ThreadPoolExecutor创建线程池

  spring threadpooltaskexecutor,ThreadPoolExecutor创建线程池

  

目录

一、ThreadPoolTaskExecutor1、将线程池用到的参数定义到配置文件中2、遗嘱执行人的工厂配置2.1、配置详情2.2、注解说明2.3、线程池配置说明2.4、线程池配置个人理解二、异步调用线程三、多线程使用场景1、定时任务@Scheduled2,程序一启动就异步执行多线程3、定义一个超文本传送协议(超文本传输协议的缩写)接口4、测试类四、总结多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用threadpooltasktexecutor来自定义线程池和实现异步调用多线程。

 

  

一、ThreadPoolTaskExecutor

本文采用实施者的工厂方法进行配置。

 

  

1、将线程池用到的参数定义到配置文件中

在项目的资源目录下创建执行者。属性文件,并添加如下配置:

 

  # 异步线程配置# 核心线程数异步。执行人。线程。core _ pool _ size=5 #最大线程数异步。执行人。线程。max _ pool _ size=8 #任务队列大小异步执行程序。线程。队列容量=2#线程池中线程的名称前缀异步。执行人。线程。姓名。前缀=异步服务-#缓冲队列中线程的空闲时间异步。执行人。线程。保持活力秒数=100

  

2、Executors 的工厂配置

 

  

2.1、配置详情

@ Configuration//@属性源是找的目标目录下班目录下的文件,资源目录下的文件编译后会生成在班目录@ property source(Value={ class path : executor。properties },ignoreResourceNotFound=false,encoding= UTF-8 )@ SLF 4j公共类执行器配置{ @ Value( $ { async。执行人。线程。core _ pool _ size } )private int corePoolSize;@ Value( $ { async。执行人。线程。max _ pool _ size } )private int maxPoolSize;@ Value( $ { async。执行人。线程。queue _ capacity }’)私有int队列容量;@ Value( $ { async。执行人。线程。姓名。前缀} )私有字符串name prefix @ Value(“$ { async。执行人。线程。keep _ alive _ seconds } )private int keepAliveSeconds;@ Bean(name= async task executor )public threadpooltaskmexecutor task executor(){ log。信息(启动);threadpooltasktexecutor=new threadpooltasktexecutor();//核心线程数执行人。setcorepoolsize(corePoolSize);//最大线程数执行人。setmaxpoolsize(maxPoolSize);//任务队列大小执行人。setqueuecapacity(队列容量);//线程前缀名执行人。setthreadname前缀(名称前缀);//线程的空闲时间执行人。setkeepaliveseconds(keepAliveSeconds);//拒绝策略执行人。setrejectedexecutionhandler(新ThreadPoolExecutor .callerrunpolicy());//线程初始化executor.initialize().返回执行人;}}

 

  maodian">

  

2.2、注解说明

@Configuration:Spring 容器在启动时,会加载带有 @Configuration 注解的类,对其中带有 @Bean 注解的方法进行处理。@Bean:是一个方法级别上的注解,主要用在 @Configuration 注解的类里,也可以用在 @Component 注解的类里。添加的 bean 的 id 为方法名。@PropertySource:加载指定的配置文件。value 值为要加载的配置文件,ignoreResourceNotFound 意思是如果加载的文件找不到,程序是否忽略它。默认为 false 。如果为 true ,则代表加载的配置文件不存在,程序不报错。在实际项目开发中,最好设置为 false 。如果 application.properties 文件中的属性与自定义配置文件中的属性重复,则自定义配置文件中的属性值被覆盖,加载的是 application.properties 文件中的配置属性。@Slf4j:lombok 的日志输出工具,加上此注解后,可直接调用 log 输出各个级别的日志。@Value:调用配置文件中的属性并给属性赋予值。

 

  

2.3、线程池配置说明

核心线程数:线程池创建时候初始化的线程数。当线程数超过核心线程数,则超过的线程则进入任务队列。最大线程数:只有在任务队列满了之后才会申请超过核心线程数的线程。不能小于核心线程数。任务队列:线程数大于核心线程数的部分进入任务队列。如果任务队列足够大,超出核心线程数的线程不会被创建,它会等待核心线程执行完它们自己的任务后再执行任务队列的任务,而不会再额外地创建线程。举例:如果有20个任务要执行,核心线程数:10,最大线程数:20,任务队列大小:2。则系统会创建18个线程。这18个线程有执行完任务的,再执行任务队列中的任务。线程的空闲时间:当 线程池中的线程数量 大于 核心线程数 时,如果某线程空闲时间超过 keepAliveTime ,线程将被终止。这样,线程池可以动态的调整池中的线程数。拒绝策略:如果(总任务数 - 核心线程数 - 任务队列数)-(最大线程数 - 核心线程数)> 0 的话,则会出现线程拒绝。举例:( 12 - 5 - 2 ) - ( 8 - 5 ) > 0,会出现线程拒绝。线程拒绝又分为 4 种策略,分别为:CallerRunsPolicy():交由调用方线程运行,比如 main 线程。AbortPolicy():直接抛出异常。DiscardPolicy():直接丢弃。DiscardOldestPolicy():丢弃队列中最老的任务。

 

  

2.4、线程池配置个人理解

当一个任务被提交到线程池时,首先查看线程池的核心线程是否都在执行任务。如果没有,则选择一条线程执行任务。如果都在执行任务,查看任务队列是否已满。如果不满,则将任务存储在任务队列中。核心线程执行完自己的任务后,会再处理任务队列中的任务。如果任务队列已满,查看线程池(最大线程数控制)是否已满。如果不满,则创建一条线程去执行任务。如果满了,就按照策略处理无法执行的任务。

 

  

二、异步调用线程

通常 ThreadPoolTaskExecutor 是和 @Async 一起使用。在一个方法上添加 @Async 注解,表明是异步调用方法函数。

 

  @Async 后面加上线程池的方法名或 bean 名称,表明异步线程会加载线程池的配置。

  

@Component@Slf4jpublic class ThreadTest { /** * 每10秒循环一次,一个线程共循环10次。 */ @Async("asyncTaskExecutor") public void ceshi3() { for (int i = 0; i <= 10; i ) { log.info("ceshi3: " i); try { Thread.sleep(2000 * 5); } catch (InterruptedException e) { e.printStackTrace(); } } }}

备注:一定要在启动类上添加 @EnableAsync 注解,这样 @Async 注解才会生效。

 

  

 

  

三、多线程使用场景

 

  

1、定时任务 @Scheduled

// 在启动类上添加 @EnableScheduling 注解@SpringBootApplication@EnableSchedulingpublic class SpringBootStudyApplication {   public static void main(String[] args) {      SpringApplication.run(SpringBootStudyApplication.class, args);   }}
// @Component 注解将定时任务类纳入 spring bean 管理。@Componentpublic class listennerTest3 {    @Autowired    private ThreadTest t;        // 每1分钟执行一次ceshi3()方法    @Scheduled(cron = "0 0/1 * * * ?")    public void run() {        t.ceshi3();    }}

ceshi3() 方法调用线程池配置,且异步执行。

 

  

@Component@Slf4jpublic class ThreadTest {    /**     * 每10秒循环一次,一个线程共循环10次。     */    @Async("asyncTaskExecutor")    public void ceshi3() {        for (int i = 0; i <= 10; i  ) {            log.info("ceshi3: "   i);            try {                Thread.sleep(2000 * 5);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}

 

  

2、程序一启动就异步执行多线程

通过继承 CommandLineRunner 类实现。

 

  

@Componentpublic class ListennerTest implements CommandLineRunner {    @Autowired    private ThreadTest t;    @Override    public void run(String... args) {        for (int i = 1; i <= 10; i  ) {            t.ceshi();        }    }}
@Component@Slf4jpublic class ThreadTest {    @Async("asyncTaskExecutor")    public void ceshi() {        log.info("ceshi");    }}

 

  

3、定义一个 http 接口

还可以通过接口的形式来异步调用多线程:

 

  

@RestController@RequestMapping("thread")public class ListennerTest2 {    @Autowired    private ThreadTest t;    @GetMapping("ceshi2")    public void run() {        for (int i = 1; i < 10; i  ) {            t.ceshi2();        }    }}
@Component@Slf4jpublic class ThreadTest {    @Async("asyncTaskExecutor")    public void ceshi2() {        for (int i = 0; i <= 3; i  ) {            log.info("ceshi2");        }    }}

 

  

4、测试类

@RunWith(SpringRunner.class)@SpringBootTestpublic class ThreadRunTest {    @Autowired    private ThreadTest t;    @Test    public void thread1() {        for (int i = 1; i <= 10; i  ) {            t.ceshi4();        }    }}
@Component@Slf4jpublic class ThreadTest {    @Async("asyncTaskExecutor")    public void ceshi4() {        log.info("ceshi4");    }}

 

  

四、总结

以上主要介绍了 ThreadPoolTaskExecutor 线程池的配置、使用、相关注解的意义及作用,也简单介绍了使用 @Async 来异步调用线程,最后又列举了多线程的使用场景,并配上了代码示例。这些仅为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。

 

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

相关文章阅读

  • spring编程式事务处理,spring编程事务
  • spring编程式事务处理,spring编程事务,详解Spring学习之编程式事务管理
  • spring的核心功能模块有几个,列举一些重要的spring模块
  • spring的核心功能模块有几个,列举一些重要的spring模块,七个Spring核心模块详解
  • spring注解和springmvc的注解,SpringMVC常用注解
  • spring注解和springmvc的注解,SpringMVC常用注解,详解springmvc常用5种注解
  • spring实现ioc的四种方法,spring的ioc的三种实现方式
  • spring实现ioc的四种方法,spring的ioc的三种实现方式,简单实现Spring的IOC原理详解
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况,Spring事务失效问题分析及解决方案
  • spring5.0新特性,spring4新特性
  • spring5.0新特性,spring4新特性,spring5新特性全面介绍
  • spring ioc以及aop原理,springmvc aop原理
  • spring ioc以及aop原理,springmvc aop原理,深入浅析Spring 的aop实现原理
  • Spring cloud网关,spring cloud zuul作用
  • 留言与评论(共有 条评论)
       
    验证码: