线程池使用
创建线程池
1.创建一个任务线程池
@Bean(name = "taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(8);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(50);
executor.setThreadNamePrefix("Async-");
executor.initialize();
// 设置线程池的线程工厂
return executor;
}
2.获取主线程变量,需重写ThreadPoolTaskExecutor中的submit方案,提交任务时将主线程变量赋值给线程池线程

3,获取主变量赋值给每一个提交的任务
private final ThreadLocal<Object[]> CURRENT_EMPLOYE = new ThreadLocal<Object[]>();
@Bean(name = "taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(){
@Override
public <T> Future<T> submit(Callable<T> task) {
//这里获取主线程变量
Object[] objects = CURRENT_EMPLOYE.get();
return super.submit(()->{
try {
//这设置提交一个任务的变量副本
CURRENT_EMPLOYE.set(objects);//将主线变量赋值给任务
return task.call();
}finally {
CURRENT_EMPLOYE.remove();//任务执行完及时删除,防止oom
}
});
}
};
executor.setCorePoolSize(8);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(50);
executor.setThreadNamePrefix("Async-");
executor.initialize();
// 设置线程池的线程工厂
return executor;
}
本文介绍了如何在创建线程池后,通过定制ThreadPoolTaskExecutor的submit方法,将主线程的变量副本传递给线程池中的任务,确保每个任务都能获取到正确的上下文信息。
494

被折叠的 条评论
为什么被折叠?



