最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

阿里TransmittableThreadLocal配合@Async使用過程

 更新時間:2026年02月04日 08:41:22   作者:蔚藍色的咸魚  
文章介紹了ThreadLocal、InheritableThreadLocal和TransmittableThreadLocal的區(qū)別,并通過實例展示了它們在不同場景下的使用方法

我們都知道ThreadLocal是可以在一個線程中當容器使用的局部變量,是線程隔離、線程安全的。

但是如果子線程要獲取父線程的變量,便不太方便

我們分別來看ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal區(qū)別

一、ThreadLocal

線程池配置

@Slf4j
@EnableAsync
@Configuration
public class ThreadPoolConfig {

    @Bean
    public Executor testExecuteAsync(){
        ThreadPoolTaskExecutor poolExecutor = new ThreadPoolTaskExecutor();
        poolExecutor.setCorePoolSize(5);
        poolExecutor.setMaxPoolSize(10);
        poolExecutor.setKeepAliveSeconds(10);
        poolExecutor.setQueueCapacity(60);
        poolExecutor.setThreadNamePrefix("testExecutor-");
        poolExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        poolExecutor.initialize();
        return poolExecutor;
    }
}

ThreadLocal工具類

public class ThreadLocalContext {

    private final static ThreadLocal<String> threadLocal = new ThreadLocal<>();

    public static String get(){
        return threadLocal.get();
    }

    public static void set(String data){
        threadLocal.set(data);
    }

    public static void remove(){
        threadLocal.remove();
    }
}

測試service

@Service
@Slf4j
public class TestService {

    @Async("testExecuteAsync")
    public void test() throws InterruptedException {
        log.info("父線程內容:{}",ThreadLocalContext.get());
    }
}

測試類

@Test
    public void test1() throws InterruptedException {
        ThreadLocalContext.set("parent:" + Thread.currentThread().getName());
        for (int i = 0; i < 5; i++) {
            testService.test();
        }
        Thread.sleep(4000);
    }

運行結果

可以看到沒有獲取到父線程內容

二、InheritableThreadLocal

修改ThreadLocal工具類

public class ThreadLocalContext {

    private final static ThreadLocal<String> threadLocal = new InheritableThreadLocal<>();

    public static String get(){
        return threadLocal.get();
    }

    public static void set(String data){
        threadLocal.set(data);
    }

    public static void remove(){
        threadLocal.remove();
    }
}

運行程序

@Test
    public void test1() throws InterruptedException {
        ThreadLocalContext.set("parent:" + Thread.currentThread().getName());
        for (int i = 0; i < 5; i++) {
            testService.test();
        }
        Thread.sleep(4000);
    }

運行結果

這里是可以獲取到父線程內容的

調整TestService代碼

@Async("testExecuteAsync")
    public void test() throws InterruptedException {
        log.info("父線程內容:{}",ThreadLocalContext.get());
        //重新設置線程變量中的值
        ThreadLocalContext.set("child:" + Thread.currentThread().getName());
    }

運行代碼

@Test
    public void test1() throws InterruptedException {
        ThreadLocalContext.set("parent:" + Thread.currentThread().getName());
        for (int i = 0; i < 5; i++) {
            testService.test();
        }
        Thread.sleep(4000);
        //第二次調用線程獲取內容
        for (int i = 0; i < 5; i++) {
            testService.test();
        }
        Thread.sleep(4000);
    }

運行結果

三、TransmittableThreadLocal

修改線程池配置

注意其中的TtlExecutors.getTtlExecutor( poolExecutor)是使用TTL對線程池進行包裹

@Bean
    public Executor testExecuteAsync(){
        ThreadPoolTaskExecutor poolExecutor = new ThreadPoolTaskExecutor();
        poolExecutor.setCorePoolSize(5);
        poolExecutor.setMaxPoolSize(10);
        poolExecutor.setKeepAliveSeconds(10);
        poolExecutor.setQueueCapacity(60);
        poolExecutor.setThreadNamePrefix("testExecutor-");
        poolExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        poolExecutor.initialize();
        return TtlExecutors.getTtlExecutor(poolExecutor);
    }

修改threadLocal工具類

public class ThreadLocalContext {

    private final static ThreadLocal<String> threadLocal = new TransmittableThreadLocal<>();

    public static String get(){
        return threadLocal.get();
    }

    public static void set(String data){
        threadLocal.set(data);
    }

    public static void remove(){
        threadLocal.remove();
    }
}

運行結果

可以看到線程每次運行都是獲取的父線程中的內容

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Spring Security OAuth2 實現登錄互踢的示例代碼

    Spring Security OAuth2 實現登錄互踢的示例代碼

    這篇文章主要介紹了Spring Security OAuth2實現登錄互踢的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • SpringBoot常用計量與bean屬性校驗和進制數據轉換規(guī)則全面分析

    SpringBoot常用計量與bean屬性校驗和進制數據轉換規(guī)則全面分析

    這篇文章主要介紹了SpringBoot常用計量、bean屬性校驗與進制數據轉換規(guī)則,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-10-10
  • org.apache.zookeeper.KeeperException.BadVersionException異常的解決

    org.apache.zookeeper.KeeperException.BadVersionException異常的解

    在使用Apache ZooKeeper進行分布式協(xié)調時,你可能會遇到org.apache.zookeeper.KeeperException.BadVersionException異常,本文就來介紹一下解決方法,感興趣的可以了解一下
    2024-03-03
  • SpringCloud灰度發(fā)布的設計與實現詳解

    SpringCloud灰度發(fā)布的設計與實現詳解

    這篇文章主要介紹了SpringCloud灰度發(fā)布的設計與實現詳解,灰度從字面意思理解就是存在于黑與白之間的一個平滑過渡的區(qū)域,所以說對于互聯網產品來說,上線和未上線就是黑與白之分,而實現未上線功能平穩(wěn)過渡的一種方式就叫做灰度發(fā)布,需要的朋友可以參考下
    2023-09-09
  • jsp、servlet前后端交互對數據處理及展示的簡單實現

    jsp、servlet前后端交互對數據處理及展示的簡單實現

    Servlet和JSP是Java Web開發(fā)中的兩個重要概念,在Servlet和JSP中前后端交互可以通過一些方式來實現,這篇文章主要給大家介紹了關于jsp、servlet前后端交互對數據處理及展示的簡單實現,需要的朋友可以參考下
    2023-12-12
  • Spring Boot兩種配置文件properties和yml區(qū)別

    Spring Boot兩種配置文件properties和yml區(qū)別

    這篇文章主要為大家介紹了java面試中常見問到的Spring Boot兩種配置文件properties和yml區(qū)別解答,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Netty粘包拆包問題解決方案

    Netty粘包拆包問題解決方案

    這篇文章主要介紹了Netty粘包拆包問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Java拖曳鼠標實現畫線功能的方法

    Java拖曳鼠標實現畫線功能的方法

    這篇文章主要介紹了Java拖曳鼠標實現畫線功能的方法,需要的朋友可以參考下
    2014-07-07
  • Java內部類應用之靜態(tài)內部類應用示例

    Java內部類應用之靜態(tài)內部類應用示例

    這篇文章主要介紹了Java內部類應用之靜態(tài)內部類應用,結合實例形式分析了Java靜態(tài)內部類的原理、功能、用法及相關操作注意事項,需要的朋友可以參考下
    2019-09-09
  • SpringBoot配置Spring Native的詳細步驟

    SpringBoot配置Spring Native的詳細步驟

    配置 Spring Native 以減少 Spring Boot 應用的啟動時間,涉及幾個關鍵步驟,包括設置相應的依賴、配置文件以及構建過程,本文給大家就介紹了詳細的步驟和配置示例,需要的朋友可以參考下
    2024-11-11

最新評論

汉阴县| 赤城县| 丹寨县| 调兵山市| 清苑县| 通江县| 衡山县| 彭阳县| 慈溪市| 威宁| 宝山区| 长寿区| 改则县| 阿拉善左旗| 巍山| 栾城县| 车致| 通化县| 乐清市| 城步| 饶阳县| 陆河县| 津市市| 丹寨县| 定结县| 西乡县| 冕宁县| 年辖:市辖区| 开远市| 三亚市| 北流市| 闽侯县| 淮北市| 四子王旗| 忻州市| 前郭尔| 萍乡市| 长治县| 晋宁县| 西峡县| 河津市|