Spring线程池ThreadPoolTaskExecutor配置详情

本文介绍了Spring线程池ThreadPoolTaskExecutor配置,分享给大家,具体如下:

1. ThreadPoolTaskExecutor配置

<!-- spring thread pool executor -->
 <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
  <!-- 线程池维护线程的最少数量 -->
  <property name="corePoolSize" value="5" />
  <!-- 允许的空闲时间 -->
  <property name="keepAliveSeconds" value="200" />
  <!-- 线程池维护线程的最大数量 -->
  <property name="maxPoolSize" value="10" />
  <!-- 缓存队列 -->
  <property name="queueCapacity" value="20" />
  <!-- 对拒绝task的处理策略 -->
  <property name="rejectedExecutionHandler">
   <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
  </property>
 </bean>

属性字段说明

corePoolSize:线程池维护线程的最少数量

keepAliveSeconds:允许的空闲时间

maxPoolSize:线程池维护线程的最大数量

queueCapacity:缓存队列

rejectedExecutionHandler:对拒绝task的处理策略

2. execute(Runable)方法执行过程

如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。

如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。

如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maxPoolSize,建新的线程来处理被添加的任务。

如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maxPoolSize,那么通过handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程 maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。

当线程池中的线程数量大于corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

3. 示例代码

Junit Test

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { MultiThreadConfig.class })
public class MultiThreadTest {

 @Autowired
 private ThreadPoolTaskExecutor taskExecutor;

 @Autowired
 private MultiThreadProcessService multiThreadProcessService;

 @Test
 public void test() {
  int n = 20;
  for (int i = 0; i < n; i++) {
   taskExecutor.execute(new MultiThreadDemo(multiThreadProcessService));
   System.out.println("int i is " + i + ", now threadpool active threads totalnum is " + taskExecutor.getActiveCount());
  }

  try {
   System.in.read();
  } catch (IOException e) {
   throw new RuntimeException(e);
  }
 }
}

MultiThreadDemo

/**
 * 多线程并发处理demo
 * @author daniel.zhao
 *
 */
public class MultiThreadDemo implements Runnable {
 private MultiThreadProcessService multiThreadProcessService;
 public MultiThreadDemo() {
 }

 public MultiThreadDemo(MultiThreadProcessService multiThreadProcessService) {
  this.multiThreadProcessService = multiThreadProcessService;
 }

 @Override
 public void run() {
  multiThreadProcessService.processSomething();
 }
}

MultiThreadProcessService

@Service
public class MultiThreadProcessService {
 public static final Logger logger = Logger.getLogger(MultiThreadProcessService.class);

 /**
  * 默认处理流程耗时1000ms
  */
 public void processSomething() {
  logger.debug("MultiThreadProcessService-processSomething" + Thread.currentThread() + "......start");
  try {
   Thread.sleep(1000);
  } catch (InterruptedException e) {
   throw new RuntimeException(e);
  }
  logger.debug("MultiThreadProcessService-processSomething" + Thread.currentThread() + "......end");
 }
}

MultiThreadConfig

 @Configuration
 @ComponentScan(basePackages = { "com.xxx.multithread" })
 @ImportResource(value = { "classpath:config/application-task.xml" })
 @EnableScheduling
 public class MultiThreadConfig {
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • spring boot使用自定义的线程池执行Async任务
  • spring boot使用自定义配置的线程池执行Async异步任务
  • 基于Spring中的线程池和定时任务功能解析
  • 浅谈Spring @Async异步线程池用法总结
(0)

相关推荐

  • spring boot使用自定义的线程池执行Async任务

    在前面的博客中,//www.jb51.net/article/134866.htm 我们使用了spring boot的异步操作,当时,我们使用的是默认的线程池,但是,如果我们想根据项目来定制自己的线程池了,下面就来说说,如何定制线程池! 一.增加配置属性类 package com.chhliu.springboot.async.configuration; import org.springframework.boot.context.properties.ConfigurationProper

  • 浅谈Spring @Async异步线程池用法总结

    本文介绍了Spring @Async异步线程池用法总结,分享给大家,希望对大家有帮助 1. TaskExecutor spring异步线程池的接口类,其实质是Java.util.concurrent.Executor Spring 已经实现的异常线程池: 1. SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程. 2. SyncTaskExecutor:这个类没有实现异步调用,只是一个同步操作.只适用于不需要多线程的地方 3. Conc

  • spring boot使用自定义配置的线程池执行Async异步任务

    在前面的博客中,http://www.jb51.net/article/106718.htm 我们使用了spring boot的异步操作,当时,我们使用的是默认的线程池,但是,如果我们想根据项目来定制自己的线程池了,下面就来说说,如何定制线程池! 一.增加配置属性类 package com.chhliu.springboot.async.configuration; import org.springframework.boot.context.properties.ConfigurationP

  • 基于Spring中的线程池和定时任务功能解析

    1.功能介绍 Spring框架提供了线程池和定时任务执行的抽象接口:TaskExecutor和TaskScheduler来支持异步执行任务和定时执行任务功能.同时使用框架自己定义的抽象接口来屏蔽掉底层JDK版本间以及Java EE中的线程池和定时任务处理的差异. 另外Spring还支持集成JDK内部的定时器Timer和Quartz Scheduler框架. 2.线程池的抽象:TaskExecutor TaskExecutor涉及到的相关类图如下: TaskExecutor接口源代码如下所示: p

  • Spring线程池ThreadPoolTaskExecutor配置详情

    本文介绍了Spring线程池ThreadPoolTaskExecutor配置,分享给大家,具体如下: 1. ThreadPoolTaskExecutor配置 <!-- spring thread pool executor --> <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 线

  • Spring线程池ThreadPoolExecutor配置并且得到任务执行的结果

    用ThreadPoolExecutor的时候,又想知道被执行的任务的执行情况,这时就可以用FutureTask. ThreadPoolTask package com.paul.threadPool; import java.io.Serializable; import java.util.concurrent.Callable; public class ThreadPoolTask implements Callable<String>, Serializable { private s

  • JDK线程池和Spring线程池的使用实例解析

    这篇文章主要介绍了JDK线程池和Spring线程池的使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JDK线程池和Spring线程池实例,异步调用,可以直接使用 (1)JDK线程池的使用,此处采用单例的方式提供,见示例: public class ThreadPoolUtil { private static int corePoolSize = 5; private static int maximumPoolSize = 10;

  • springboot使用线程池(ThreadPoolTaskExecutor)示例

    目录 线程池创建 线程池参数 线程池测试1(核心线程数量) 线程池测试2(当核心线程数量和最大线程数量不够时) 总结 代码仓库:gitee 线程池创建 @Configuration @EnableAsync public class TaskPoolConfig { @Bean("syncExecutorPool") public Executor taskExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPool

  • Spring Cloud Hystrix 线程池队列配置(踩坑)

    背景: 有一次在生产环境,突然出现了很多笔还款单被挂起,后来排查原因,发现是内部系统调用时出现了Hystrix调用异常.在开发过程中,因为核心线程数设置的比较大,没有出现这种异常.放到了测试环境,偶尔有出现这种情况,后来在网上查找解决方案,网上的方案是调整maxQueueSize属性就好了,当时调整了一下,确实有所改善.可没想到在生产环境跑了一段时间后却又出现这种了情况,此时我第一想法就是去查看maxQueueSize属性,可是maxQueueSize属性是设置值了.当时就比较纳闷了,为什么ma

  • 完全解析Android多线程中线程池ThreadPool的原理和使用

    前言对于多线程,大家应该很熟悉.但是,大家了解线程池吗?今天,我将带大家全部学习关于线程池的所有知识. 目录 1. 简介 2. 工作原理 2.1 核心参数线程池中有6个核心参数,具体如下 上述6个参数的配置 决定了 线程池的功能,具体设置时机 = 创建 线程池类对象时 传入 ThreadPoolExecutor类 = 线程池的真正实现类 开发者可根据不同需求 配置核心参数,从而实现自定义线程池 // 创建线程池对象如下 // 通过 构造方法 配置核心参数 Executor executor =

  • python线程池threadpool使用篇

    最近在做一个视频设备管理的项目,设备包括(摄像机,DVR,NVR等),包括设备信息补全,设备状态推送,设备流地址推送等,如果同时导入的设备数量较多,如果使用单线程进行设备检测,那么由于设备数量较多,会带来较大的延时,因此考虑多线程处理此问题. 可以使用python语言自己实现线程池,或者可以使用第三方包threadpool线程池包,本主题主要介绍threadpool的使用以及其里面的具体实现. 1.安装 使用安装: pip installthreadpool 2.使用 (1)引入threadpo

  • 对spring task和线程池的深入研究

    目录 spring task和线程池的研究 1.如何实现spring task定时任务的配置 2.task里面的一个job方法如何使用多线程,配置线程池 spring 线程池配置 默认线程池ThreadPoolTaskExecutor配置 自定义线程池ThreadPoolTaskExecutor配置 spring task和线程池的研究 最近因工作需求,研究了一下spring task定时任务,和线程池,有了一定收获,记录一下 涉及如下内容 1.如何实现spring task定时任务的配置 2.

  • Spring使用ThreadPoolTaskExecutor自定义线程池及异步调用方式

    目录 一.ThreadPoolTaskExecutor 1.将线程池用到的参数定义到配置文件中 2.Executors的工厂配置 2.1.配置详情 2.2.注解说明 2.3.线程池配置说明 2.4.线程池配置个人理解 二.异步调用线程 三.多线程使用场景 1.定时任务@Scheduled 2.程序一启动就异步执行多线程 3.定义一个http接口 4.测试类 四.总结 多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实

随机推荐