Executors 的工厂配置
- 配置详情
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.sleuth.instrument.async.LazyTraceThreadPoolTaskExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 线程池配置类
*/
@Configuration
public class PoolConfiguration {
@Autowired
private BeanFactory beanFactory;
@Bean("monitorThreadPoolTaskTaskExecutor")
public LazyTraceThreadPoolTaskExecutor monitorThreadPoolTaskTaskExecutor(){
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(10); // 核心线程数
threadPoolTaskExecutor.setMaxPoolSize(20);// 最大线程数
threadPoolTaskExecutor.setQueueCapacity(100); //工作队列
threadPoolTaskExecutor.setKeepAliveSeconds(60); // 非核心线程的空闲存活时间
threadPoolTaskExecutor.setAllowCoreThreadTimeOut(true);//指定是否允许核心线程超时。这允许动态增长和收缩,即使与非零队列结合使用也是如此(因为最大池大小只有在队列已满时才会增长)
threadPoolTaskExecutor.setThreadNamePrefix("monitor-thread-pool-");// 设置线程名前缀
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());// 拒绝策略
threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);// 设置线程池关闭时需要等待子任务执行完毕,才销毁对应的bean
threadPoolTaskExecutor.initialize();//初始化线程池
// `return new LazyTraceExecutor(beanFactory, executor);` 这行代码返回的是一个`LazyTraceExecutor`的实例。
//`LazyTraceExecutor` 是由Spring Cloud Sleuth 提供的额外功能实现,它将传递Spring Cloud Sleuth的trace信息使线程池的执行操作能运用Sleuth的跟踪特性,以便于分析和调试分布式系统的异步行为。返回类型为Executor,它是Java执行异步任务的高级接口
return new LazyTraceThreadPoolTaskExecutor(beanFactory,threadPoolTaskExecutor);
}
}
Test方法使用线程池
- Test方法
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.sleuth.instrument.async.LazyTraceThreadPoolTaskExecutor;
import javax.annotation.Resource;
@SpringBootTest
class DemoApplicationTests {
@Resource(name = "monitorThreadPoolTaskTaskExecutor")
private LazyTraceThreadPoolTaskExecutor lazyTraceThreadPoolTaskExecutor;
@Test
public void testExecutorPool() {
for (int i = 0; i < 20; i++) {
int taskNumber = i;
lazyTraceThreadPoolTaskExecutor.execute(() -> {
System.out.println(Thread.currentThread().getName() + ": 开始处理任务 " + taskNumber);
try {
// 这里模拟任务处理时间
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": 结束处理任务 " + taskNumber);
});
}
lazyTraceThreadPoolTaskExecutor.shutdown(); // 关闭线程池,不再接受新任务,但会处理完任务队列中的所有任务
}
}
效果: