首页 > 其他分享 >spring集成的线程池ThreadPoolTaskExecutor使用2.0

spring集成的线程池ThreadPoolTaskExecutor使用2.0

时间:2022-10-21 10:44:53浏览次数:59  
标签:getThreadPoolTaskExecutor 队列 spring 30 int 线程 2.0 taskExecutePool

线程池的执行流程

所有线程池的执行流程都相同,如下图所示

线程池不同场景测试

根据线程池不同参数进行测试

测试service

@Service
@Slf4j
public class ThreadPoolService {

    @Resource
    TaskExecutePool taskExecutePool;
    public static int num = 1;

    public void invokeThread(int count,int time){
        for (int i = 0; i < count; i++) {
            taskExecutePool.getThreadPoolTaskExecutor().execute(()->{
                log.info("线程开始*****"+"当前还有{}个线程,队列容量为{},核心线程数{}",taskExecutePool.getThreadPoolTaskExecutor().getActiveCount(),taskExecutePool.getThreadPoolTaskExecutor().getPoolSize()
                +taskExecutePool.getThreadPoolTaskExecutor().getCorePoolSize());
                try {
                    num++;
                    Thread.sleep((long) (time+Math.random()*1000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                log.info("线程结束,"+"当前还有{}个线程,队列容量为{},num{}",taskExecutePool.getThreadPoolTaskExecutor().getActiveCount(),taskExecutePool.getThreadPoolTaskExecutor().getPoolSize(),num);
            });
        }

    }
}

测试controller

    @RequestMapping("/thread/{count}/{time}")
    public String startThread(@PathVariable int count,@PathVariable int time){
        long starttime = System.currentTimeMillis();
        threadPoolService.invokeThread(count,time);
        long endtime = System.currentTimeMillis();
        long second = (endtime - starttime)/1000;
        return "执行" + second + "秒";
    }
测试场景

1.小于核心线程数

2.大于核心线程数,小于工作队列

3.大于工作队列,小于工作队列+核心线程数

4.大于工作队列,小于工作队列+最大线程数

5.大于工作队列+最大线程数

核心线程数 最大线程数 超时时间 拒绝策略 发起线程数量 单个线程睡眠时间 同步接口返回时间 所有线程执行时间总和 活跃线程数 线程池线程数
5 30 100 CallerRunsPolicy 1 5 0 5 1->0 1
1 5 0 5 1->0 2
1 5 0 5 1->0 3
4 5 0 6 4->0 5
10 5 0 11 5->0 5
50 5 0 55 5->0 5
103 5 0 103 5->0 5
120 5 0 35 20->0 20->5
150 5 5 28 30->0 30->5
200 5 16 39 30->0 30->5

6.如果是抛出异常的拒绝策略

{"code":"400","message":"Executor [java.util.concurrent.ThreadPoolExecutor@76bd0946[Running, pool size = 30, active threads = 30, queued tasks = 100, completed tasks = 0]] did not accept task: com.example.demo.service.impl.ThreadPoolService$$Lambda$925/759725605@5c2f29bb","data":null}

总结

超过线程池容量,会变成同步线程阻塞,等线程池以最大线程数处理将线程容量处理到小于容量加最大线程数时才会变成同步线程。如果有一些共享变量,就会变得特别危险

标签:getThreadPoolTaskExecutor,队列,spring,30,int,线程,2.0,taskExecutePool
From: https://www.cnblogs.com/yorkiiz/p/16812668.html

相关文章

  • Springboot 项目普通类调用 Mapper 接口使用 MybatisPlus 报错:空指针异常(NullPointer
    Springboot项目普通类调用Mapper接口使用MybatisPlus报错:空指针异常(NullPointerException)报错开发时,在普通类调用Mapper接口使用MabatisPlus功能时会报出......
  • ubuntu-22.04.1-live-server-amd64 安装教程
     下载U盘工具  go下载iso镜像  go https://releases.ubuntu.com/22.04/ubuntu-22.04.1-live-server-amd64.iso启动盘制作电脑U盘启动安装系统选硬盘......
  • Spring上传文件报错the request was rejected because its size (15920203) exceeds t
    背景今天在查异常日志的时候,发现了一条这样的报错therequestwasrejectedbecauseitssize(15920203)exceedstheconfiguredmaximum(10485760)详细堆栈如下:or......
  • 进程、线程和多线程
    进程间通讯(IPC):管道、信号量、共享内存、消息队列、套接字管道:有名无名(有名无名的区别),在内存中写入,通讯方式:半双工信号量:特殊变量(一般取值大于等于0)例如0、1代表资源状......
  • java中的多线程的常用方法
    java中的多线程的常用方法/*Java中Thread(线程)中的常用方法。1.start():用来启动当前线程,调用当前线程的run()2.run():通常需要重写Thread中的此方法,将创建的线程......
  • SpringMVC
    基本使用:1.使用springMVC技术需要先导入servlet和springMVC(spring-webmvc)坐标2.创建一个springMVC的控制器类(等同于servlet功能)@controller是springMVC专属的,@RequestMap......
  • 线程池
    线程池概论线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池的好处降低资源的消耗提高响应速度方便管理总......
  • 多线程
    多线程概念:Windows操作系统是多任务操作系统,它以进程为单位。每个独立执行的程序被称为一个进程,而每个进程又包含多个线程。系统可以分配给每个进程一段使用CPU的时间(CPU......
  • CPU密集型和IO密集型(判断最大核心线程的最大线程数)
    CPU密集型和IO密集型(判断最大核心线程的最大线程数)CPU密集型1.CPU密集型获取电脑CPU的最大核数,几核,最大线程数就是几Runtime.getRuntime().availableProcessors()--->......
  • 测试开发jmeter设置线程序号
    测试开发jmeter设置线程序号${__threadNum}需要在请求的名称后面加上${__threadNum}    然后运行结果如下: ......