SpringBoot全局线程池

前言

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

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

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

正文

线程池配置类

ThreadToolConfig.java

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

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);
        }
    }
}

调用

@Autowired
private MutiThreadUtil mutiThreadUtil;

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

 

posted @ 2022-04-29 15:08  八英里  阅读(1964)  评论(0编辑  收藏  举报