Springboot实现多线程及线程池监控

 更新时间:2024年01月31日 11:03:50   作者:i学无止境  
线程池的监控很重要,本文就来介绍一下Springboot实现多线程及线程池监控,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

线程池的优点

  • 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗
  • 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行
  • 可以对线程做统一管理。

1.配置线程池

修改配置文件

# 异步线程配置
# 配置核心线程数
async:
  executor:
    thread:
      core_pool_size: 5 # 配置核心线程数
      max_pool_size: 5 # 配置最大线程数
      queue_capacity: 99999 # 配置队列大小
      name:
        prefix: async-service- # 配置线程池中的线程的名称前

线程池配置类

package com.bt.springboot.config;

import com.bt.springboot.task.ThreadPoolMonitor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @author zkx
 * @Date 2022/12/6 21:42
 */
@Slf4j
@Configuration
@EnableAsync
public class ExecutorConfig {

	@Value("${async.executor.thread.core_pool_size}")
	private int corePoolSize;
	@Value("${async.executor.thread.max_pool_size}")
	private int maxPoolSize;
	@Value("${async.executor.thread.queue_capacity}")
	private int queueCapacity;
	@Value("${async.executor.thread.name.prefix}")
	private String namePrefix;

	@Bean(name = "asyncServiceExecutor")
	public Executor asyncServiceExecutor() {
		log.info("start asyncServiceExecutor");
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		//配置核心线程数
		executor.setCorePoolSize(corePoolSize);
		//配置最大线程数
		executor.setMaxPoolSize(maxPoolSize);
		//配置队列大小
		executor.setQueueCapacity(queueCapacity);
		//配置线程池中的线程的名称前缀
		executor.setThreadNamePrefix(namePrefix);

		// rejection-policy:当pool已经达到max size的时候,如何处理新任务
		// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
		//执行初始化
		executor.initialize();
		return executor;
	}
}

2.监控类

package com.bt.springboot.task;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;

import java.util.concurrent.ThreadPoolExecutor;

/**
 * @Author: ChenBin
 */
@Slf4j
@Component
public class ThreadPoolMonitor extends ThreadPoolTaskExecutor {

	@Value("${async.executor.thread.name.prefix}")
	private String namePrefix;

	@Scheduled(cron = "0/1 * * * * ? ")
	private void showThreadPoolInfo() {
		ThreadPoolExecutor threadPoolExecutor = getThreadPoolExecutor();
		if (namePrefix.equals(this.getThreadNamePrefix())){
			log.info("{} taskCount [{}], completedTaskCount [{}], activeCount [{}], queueSize [{}]",
					this.getThreadNamePrefix(),
					threadPoolExecutor.getTaskCount(),
					threadPoolExecutor.getCompletedTaskCount(),
					threadPoolExecutor.getActiveCount(),
					threadPoolExecutor.getQueue().size());
		}
	}
}

开启定时任务

在这里插入图片描述

3.修改线程池配置类

ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

修改为ThreadPoolTaskExecutor executor = new ThreadPoolMonitor();

4.测试相关类

AsyncService

package com.bt.springboot.async;

/**
 * @author zkx
 * @Date 2022/12/6 21:47
 */
public interface AsyncService {

	/**
	 * 执行异步任务
	 * 可以根据需求,自己加参数拟定,我这里就做个测试演示
	 */
	void executeAsync();
}

AsyncServiceImpl

package com.bt.springboot.async.impl;

import com.bt.springboot.async.AsyncService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

/**
 * @author zkx
 * @Date 2022/12/6 21:48
 */
@Slf4j
@Service
public class AsyncServiceImpl implements AsyncService {



	@Override
	@Async("asyncServiceExecutor")
	public void executeAsync() {
		int i = 5;
		while(i > 0){
			i--;
			log.info("execute task");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
				Thread.currentThread().interrupt();
			}
		}
	}
}

AsyncController

package com.bt.springboot.web.controller;

import com.bt.springboot.async.AsyncService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author zkx
 * @Date 2022/12/9 17:38
 */
@RestController
public class AsyncController {

	@Autowired
	private AsyncService asyncService;

	@GetMapping("/asyncTask")
	public void asyncTask(){
		asyncService.executeAsync();
	}
}

5.启动

1.执行任务前

2.执行任务

在这里插入图片描述

3.任务完成

在这里插入图片描述

到此这篇关于Springboot实现多线程及线程池监控的文章就介绍到这了,更多相关Springboot 多线程及线程池监控内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • 关于Mybatis和JDBC的使用及区别

    关于Mybatis和JDBC的使用及区别

    这篇文章主要介绍了关于Mybatis和JDBC的使用及区别,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • springboot的Customizer源码解析

    springboot的Customizer源码解析

    这篇文章主要为大家介绍了springboot的Customizer源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Java实现的傅里叶变化算法示例

    Java实现的傅里叶变化算法示例

    这篇文章主要介绍了Java实现的傅里叶变化算法,结合具体实例形式分析了基于Java的傅里叶变化算法定义与使用相关操作技巧,需要的朋友可以参考下
    2018-06-06
  • 深入解析java HashMap实现原理

    深入解析java HashMap实现原理

    这篇文章主要介绍了深入解析java HashMap实现原理的相关资料,需要的朋友可以参考下
    2015-09-09
  • Java实现二叉树的基本操作详解

    Java实现二叉树的基本操作详解

    这篇文章主要为大家详细介绍了Java数据结构与算法中二叉树的基本操作,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2022-10-10
  • Java中的System.arraycopy()浅复制方法详解

    Java中的System.arraycopy()浅复制方法详解

    这篇文章主要介绍了Java中的System.arraycopy()浅复制方法详解,Java数组的复制操作可以分为深度复制和浅度复制,简单来说深度复制,可以将对象的值和对象的内容复制;浅复制是指对对象引用的复制,需要的朋友可以参考下
    2023-11-11
  • SpringAop @Aspect织入不生效,不执行前置增强织入@Before方式

    SpringAop @Aspect织入不生效,不执行前置增强织入@Before方式

    这篇文章主要介绍了SpringAop @Aspect织入不生效,不执行前置增强织入@Before方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java如何从linux服务器下载文件

    java如何从linux服务器下载文件

    这篇文章主要介绍了java如何从linux服务器下载文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Spring MVC url提交参数和获取参数

    Spring MVC url提交参数和获取参数

    本文重要讲述通过url提交参数和获取参数的具体操作与实现。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • Spring中@Autowired @Resource @Inject三个注解有什么区别

    Spring中@Autowired @Resource @Inject三个注解有什么区别

    在我们使用Spring框架进行日常开发过程中,经常会使用@Autowired, @Resource, @Inject注解来进行依赖注入,下面来介绍一下这三个注解有什么区别
    2023-03-03

最新评论