ThreadPoolExecutor的使用

2023-09-21 10:09:22

1.在SpringBoot项目中使用ThreadPoolExecutor:

SpringBoot中可以通过创建一个配置类来定义ThreadPoolExecutor,然后在需要使用的地方直接注入即可。

@Configuration
public class ThreadPoolConfig {

    @Bean
    public Executor asyncServiceExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //配置核心线程数
        executor.setCorePoolSize(5);
        //配置最大线程数
        executor.setMaxPoolSize(50);
        //配置队列大小
        executor.setQueueCapacity(1000);
        //配置线程池中的线程的名称前缀
        executor.setThreadNamePrefix("async-service-");

        executor.initialize();
        return executor;
    }
}


在需要使用的地方通过@Autowired注入ThreadPoolExecutor即可。

@Service
public class ExampleService {

    @Autowired
    private Executor asyncServiceExecutor;

    //...
}


2.ThreadPoolExecutor的工作流程:

ThreadPoolExecutor在执行execute方法时,首先判断核心线程数是否已满,如果没有满则创建一个新的核心线程来执行传入的任务。如果核心线程已满,那么就将任务放入到队列中。如果队列已满,那么就尝试创建非核心线程来执行任务。如果非核心线程已满,那么就执行拒绝策略。

3.ThreadPoolExecutor的配置:

主要配置参数有:
corePoolSize:核心线程数
maximumPoolSize:最大线程数
keepAliveTime:空闲线程的存活时间
unit:存活时间的单位
workQueue:任务队列
threadFactory:线程工厂,用于创建新的线程
handler:拒绝策略

4.示例:下面给出一个使用ThreadPoolExecutor的示例:
 

public class ThreadPoolExample {

    private static final int CORE_POOL_SIZE = 5;
    private static final int MAXIMUM_POOL_SIZE = 10;
    private static final long KEEP_ALIVE_TIME = 1;
    private static final TimeUnit TIME_UNIT = TimeUnit.MINUTES;
    private static final BlockingQueue<Runnable> WORK_QUEUE = new ArrayBlockingQueue<>(100);

    private static final ThreadPoolExecutor EXECUTOR = 
        new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_TIME, TIME_UNIT, WORK_QUEUE);

    public static void main(String[] args) {
        for (int i = 0; i < 50; i++) {
            int finalI = i;
            EXECUTOR.execute(() -> System.out.println("Running task " + finalI + " on thread " + Thread.currentThread().getName()));
        }
        EXECUTOR.shutdown();
    }
}


5.分析:

此示例创建了一个线程池,拥有5个核心线程,最多可以创建10个线程,当线程数大于5而小于10时,如果空闲线程超过1分钟,那么此线程将被终止。任务队列的长度为100,也就是说最多可以缓存100个待执行的任务。

6.ThreadPoolExecutor创建线程池的方式:

ThreadPoolExecutor创建线程池主要使用以下两种方式:

使用ThreadPoolExecutor的构造方法

使用Executors工具类的静态工厂方法

7.参数解释:

corePoolSize:线程池的基本大小
maximumPoolSize:线程池最大线程数
workQueue:线程池中的任务队列.常用的有三种队列,SynchronousQueue,LinkedBlockingDeque,ArrayBlockingQueue.
keepAliveTime:线程池的工作线程空闲后,保持存活的时间。所以,如果任务很多,并且每个任务执行的时间比较短,可以调大时间,提高线程的利用率。
TimeUnit:keepAliveTime的时间单位
threadFactory:每次创建新的线程工厂
RejectedExecutionHandler:当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理

更多推荐

免费IP类api接口:含ip查询、ip应用场景查询、ip代理识别、IP行业查询...

免费IP类api接口:含ip查询、ip应用场景查询、ip代理识别…IP归属地-IPv6区县级:根据IP地址(IPv6版本)查询归属地信息,包含国家、省、市、区县和运营商等信息。IP归属地-IPv6城市级:根据IP地址(IPv6版本)查询归属地信息,支持到中国大陆地区(不含港澳台地区)城市级别,包含国家、省、市和运营商等

酷开科技打造更好体验服务用户

智能电视以其海量资源、智慧大屏、高清画质等特点在国内快速普及。然而,随着用户量的增加、用户群体的需求多元化,导致消费者对智能电视的应用要求越来越高,不仅希望智能电视内容丰富,最好还能拥有“多合一”的功能。好在,一些科技企业关注到市场痛点,致力于将技术创新与完善的内容输出相结合,为广大消费者带来更多惊喜。酷开科技就是其中

Kafka开篇

前言从本篇开始对个人Kafka学习做一个总结,目标有这么几个。从概念架构角度,对消息中间件形成概要认知;从使用角度,掌握其常见用法;从性能角度,探究其高性能实现机制;消息中间件的用途从消息生产和消费的角度,平衡消费者和消费者的速率差。基于该点可以做到削峰填谷,比如流量突发,日志处理等。从系统解耦的角度,解耦生产者和消费

React 全栈体系(九)

第五章React路由一、相关理解1.SPA的理解单页Web应用(singlepagewebapplication,SPA)。整个应用只有一个完整的页面。点击页面中的链接不会刷新页面,只会做页面的局部更新。数据都需要通过ajax请求获取,并在前端异步展现。2.路由的理解2.1什么是路由?一个路由就是一个映射关系(key:

Mysql的常见错误总结

Mysql的常见错误总结Datatruncation:Outofrangevalueofforcolumn在执行一个update语句的时候,报错Datatruncation:Outofrangevalueofforcolumn‘CLAIM_QUANTITY’…update语句是把’CLAIM_QUANTITY’这个字段

使用Python编写一个多线程的12306抢票程序

国庆长假即将到来,大家纷纷计划着自己的旅行行程。然而,对于很多人来说,抢购火车票人们成了一个令人头疼的问题。12306网站的服务器经常因为流量高而崩溃,导致抢票变得越来越严重异常困难。首先,让我们来了解一下12306抢票的难点。由于很多人都在同一时间段内访问12306网站,服务器的负载率非常高,导致网站响应变慢甚至崩溃

【uniapp】小程序开发:3 分包配置

分包加载配置,此配置为小程序的分包加载机制。因小程序有体积和资源加载限制,各家小程序平台提供了分包方式,优化小程序的下载和启动速度。所谓的主包,即放置默认启动页面/TabBar页面,以及一些所有分包都需用到公共资源/JS脚本;而分包则是根据pages.json的配置进行划分。在小程序启动时,默认会下载主包并启动主包内页

ReactNative 网络库

WhatJS判断网络状态不准确react-native-netinfo在Android中的结构type-CellularGeneration:G网模式枚举type-ConnectionType:网络连接类型AmazonFireDeviceConnectivityPoller:Amazon设备网络适配,可忽略Broadc

字符串函数和内存函数详解(2)

🐵本文会将会对剩余的字符串库函数和内存函数进行讲解1.strstr📚1.1函数用法✏️strstr函数原型:strstr用于在字符串中找子串,strstr会返回str1中出现str2的起始地址,如果在str1中没有找到str2,则返回空指针1.2具体实现🖊️#include<stdio.h>#include<st

秋招如何做好IT面试准备

一年一季又是到了秋招的日子,回首去年这时候的自己也在准备面试中苦苦挣扎,在这里给各位学弟学妹分享一些面试准备的小技巧吧。方向一:分享你面试IT公司的小技巧IT公司区别与其他公司肯定对技术要求更高,所以首先你要准备的是你简历上写的东西你是否都能回答的上,因为大部分公司面试第一出发点都是你的简历,不要在简历上胡吹海侃给自己

视觉Transformer在低级视觉领域的研究综述

视觉Transfomer的基本原理在图像处理过程中,ViT首先将输入的图片分成块,对其进行线性的编码映射后排列成一堆的向量作为编码器的输入,在分类任务中会在这个一维向量加入了一个可学习的嵌入向量用作分类的类别预测结果表示,最后通过一个全连接层输出结果注意力机制注意力机制让网络更聚焦于输入中相关信息的方法,从而减少对无关

热文推荐