Java实现threadLocal线程池获取
更新时间:2023年07月28日 09:57:22 作者:清晨细雨~
本文主要介绍了Java实现threadLocal线程池获取,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
问题:
ThreadLocal默认不支持子线程获取,而InheritableThreadLocal支持子线程获取threadLocal值,但是如果使用线程池,核心个数为1则子线程会获取到上一个threadLocal的值。
解决:
1.引入transmittable-thread-local jar
<dependency> <groupId>com.alibaba</groupId> <artifactId>transmittable-thread-local</artifactId> <version>2.11.4</version> </dependency>
2. threadLocal 初始化
private static final TransmittableThreadLocal<User> CURRENT_USER_HOLDER = new TransmittableThreadLocal();
3. Executor bean,使用TtlExecutor
@Bean(value = "defaultThreadPool")
public Executor buildQueueThreadPool() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
int cpuNum = Runtime.getRuntime().availableProcessors();
// 设置核心线程数
executor.setCorePoolSize(Math.min(cpuNum * 2, 16));
// 设置最大线程数
executor.setMaxPoolSize(cpuNum * 2);
//队列中最大的数目
executor.setQueueCapacity(300);
//线程名称前缀
executor.setThreadNamePrefix("defaultThreadPool_");
//rejection-policy:当pool已经达到max size的时候,如何处理新任务
//CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
//对拒绝task的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//线程空闲后的最大存活时间
executor.setKeepAliveSeconds(60);
//加载
executor.initialize();
return TtlExecutors.getTtlExecutor(executor);
}到此这篇关于Java实现threadLocal线程池获取的文章就介绍到这了,更多相关Java threadLocal线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringCloud使用FFmpeg对视频压缩处理的代码示例
在现代的视频处理系统中,压缩视频以减小存储空间、加快传输速度是一项非常重要的任务,FFmpeg作为一个强大的开源工具,广泛应用于音视频的处理,包括视频的压缩和格式转换等,本文将通过Java代码示例,向您展示如何使用FFmpeg进行视频压缩,并介绍相关参数的设置2024-11-11
SpringMVC 重新定向redirect请求中携带数据方式
这篇文章主要介绍了SpringMVC 重新定向redirect请求中携带数据方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12
基于Spring框架由ConditionalOnMissingBean注解引发的问题
这篇文章主要介绍了基于Spring框架由ConditionalOnMissingBean注解引发的问题,具有很好2023-11-11


最新评论