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:不在新線程中執(zhí)行任務,而是由調用者所在的線程來執(zhí)行
//對拒絕task的處理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//線程空閑后的最大存活時間
executor.setKeepAliveSeconds(60);
//加載
executor.initialize();
return TtlExecutors.getTtlExecutor(executor);
}到此這篇關于Java實現threadLocal線程池獲取的文章就介紹到這了,更多相關Java threadLocal線程池內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringCloud使用FFmpeg對視頻壓縮處理的代碼示例
在現代的視頻處理系統(tǒng)中,壓縮視頻以減小存儲空間、加快傳輸速度是一項非常重要的任務,FFmpeg作為一個強大的開源工具,廣泛應用于音視頻的處理,包括視頻的壓縮和格式轉換等,本文將通過Java代碼示例,向您展示如何使用FFmpeg進行視頻壓縮,并介紹相關參數的設置2024-11-11
SpringBoot靜態(tài)資源與首頁配置實現原理深入分析
最近在做SpringBoot項目的時候遇到了“白頁”問題,通過查資料對SpringBoot訪問靜態(tài)資源做了總結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2022-10-10
SpringMVC 重新定向redirect請求中攜帶數據方式
這篇文章主要介紹了SpringMVC 重新定向redirect請求中攜帶數據方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
基于Spring框架由ConditionalOnMissingBean注解引發(fā)的問題
這篇文章主要介紹了基于Spring框架由ConditionalOnMissingBean注解引發(fā)的問題,具有很好2023-11-11
Java Kafka分區(qū)發(fā)送及消費實戰(zhàn)
本文主要介紹了Kafka分區(qū)發(fā)送及消費實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07

