线程池配置类
package com.xz.zriyochat.common.thread;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
@Configuration
@EnableAsync //spring线程池管理
public class ThreadPoolConfig implements AsyncConfigurer {
/**
* 项目共用线程池
*/
public static final String ZRIYOCHAT_EXECUTOR = "zriyochatExecutor";
/**
* websocket通信线程池
*/
public static final String WS_EXECUTOR = "websocketExecutor";
@Override
public Executor getAsyncExecutor() {
return zriyochatExecutor();
}
@Bean(ZRIYOCHAT_EXECUTOR)
@Primary
public ThreadPoolTaskExecutor zriyochatExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);//核心线程
//优雅停机:确保所有正在处理的请求或事务能够顺利完成,而不影响系统的数据完整性和一致性。 如果不设置true就不会优雅停机
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setMaxPoolSize(10);//最大线程
executor.setQueueCapacity(200);//任务队列的容量
executor.setThreadNamePrefix("zriyochat-executor-");
//满了调用,线程执行提交任务的那个线程自己来执行这个任务。
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//添加了一个异常捕获器
executor.setThreadFactory(new DeficitThreadFactory(executor));
executor.initialize();
return executor;
}
}
异常捕获
executor.setThreadFactory(new DeficitThreadFactory(executor));
是默认的线程工厂 那么我们追进去 我们可以看到他的参数是ThreadFactory 他的父类实现了ThreadFactory
ThreadFactory
在这里没有去设置线程捕获器
那么我使用装饰器模式不会改变原有的功能,而是在功能前后做一个扩展点 。完全适合我们这次的改动。
package com.xz.zriyochat.common.thread;
import lombok.AllArgsConstructor;
import java.util.concurrent.ThreadFactory;
@AllArgsConstructor
public class DeficitThreadFactory implements ThreadFactory {
private static final MyUncaughtExceptionHandler MY_UNCAUGHT_EXCEPTION_HANDLER = new MyUncaughtExceptionHandler();
private ThreadFactory original;
@Override
public Thread newThread(Runnable r) {
//调用了
Thread thread = original.newThread(r);
thread.setUncaughtExceptionHandler(MY_UNCAUGHT_EXCEPTION_HANDLER);
return thread;
}
}