首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >SpringBoot全局线程池

SpringBoot全局线程池

作者头像
码客说
发布2022-03-07 14:25:54
发布2022-03-07 14:25:54
1.9K0
举报
文章被收录于专栏:码客码客

前言

我们在做WS服务器的时候,如果我们在接收消息的方法中对所有用户群发消息的时候,如果不用线程池发送,那么就相当于在该线程中串行的发送消息,如果用户较多,就会占用大量时间,这时就需要使用线程池。

但是直接使用线程池的话,如果同时有3个连接,我们创建的线程池的线程数量是5,那么在使用中就会占用15个线程,这就十分恐怖,实际使用中用户数非常多的情况会创建大量的线程,最终导致服务不可用。

所以我们就要设置一个全局线程池(公共线程池)来处理消息的发送。

正文

线程池配置类

ThreadToolConfig.java

代码语言:javascript
复制
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;

@Configuration
@EnableAsync
public class ThreadToolConfig {
    @Bean("msgThreadPool")
    public Executor msgThreadPool() {
        //获取当前机器的核数
        int cpuNum = Runtime.getRuntime().availableProcessors();
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //配置核心线程数cpuNum
        executor.setCorePoolSize(cpuNum);
        //配置最大线程数cpuNum * 2
        executor.setMaxPoolSize(cpuNum * 2);
        //配置队列大小
        executor.setQueueCapacity(300);
        //线程存活时间
        executor.setKeepAliveSeconds(60);
        //配置线程池中的线程的名称前缀
        executor.setThreadNamePrefix("pool-thread-");
        // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //执行初始化
        executor.initialize();
        return executor;
    }
}

需要多线程调用方法对应的类

MutiThreadUtil.java

代码语言:javascript
复制
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.yeauty.pojo.Session;

@Component
@Slf4j
public class MutiThreadUtil {
    @Async("msgThreadPool")
    public void sendMessageText(Session session, String msg){
        log.error("线程名:" + Thread.currentThread().getName());
        if(session!=null && session.isActive()){
            session.sendText(msg);
        }
    }
}

调用

代码语言:javascript
复制
@Autowired
private MutiThreadUtil mutiThreadUtil;

public void sendMessageText(){
  mutiThreadUtil.sendMessageText("123");
}

注意

需要多线程调用的方法一定要放在单独的类中才能生效。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 正文
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档