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

阿里TransmittableThreadLocal配合@Async使用過程

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

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

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

我們分別來看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("父線程內(nèi)容:{}",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);
    }

運行結(jié)果

可以看到?jīng)]有獲取到父線程內(nèi)容

二、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);
    }

運行結(jié)果

這里是可以獲取到父線程內(nèi)容的

調(diào)整TestService代碼

@Async("testExecuteAsync")
    public void test() throws InterruptedException {
        log.info("父線程內(nèi)容:{}",ThreadLocalContext.get());
        //重新設(shè)置線程變量中的值
        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);
        //第二次調(diào)用線程獲取內(nèi)容
        for (int i = 0; i < 5; i++) {
            testService.test();
        }
        Thread.sleep(4000);
    }

運行結(jié)果

三、TransmittableThreadLocal

修改線程池配置

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

@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();
    }
}

運行結(jié)果

可以看到線程每次運行都是獲取的父線程中的內(nèi)容

總結(jié)

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

相關(guān)文章

  • Spring Security OAuth2 實現(xiàn)登錄互踢的示例代碼

    Spring Security OAuth2 實現(xiàn)登錄互踢的示例代碼

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

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

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

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

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

    SpringCloud灰度發(fā)布的設(shè)計與實現(xiàn)詳解

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

    jsp、servlet前后端交互對數(shù)據(jù)處理及展示的簡單實現(xiàn)

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

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

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

    Netty粘包拆包問題解決方案

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

    Java拖曳鼠標(biāo)實現(xiàn)畫線功能的方法

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

    Java內(nèi)部類應(yīng)用之靜態(tài)內(nèi)部類應(yīng)用示例

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

    SpringBoot配置Spring Native的詳細(xì)步驟

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

最新評論

芷江| 临沧市| 图木舒克市| 怀远县| 达州市| 银川市| 彭阳县| 罗江县| 泰安市| 西昌市| 老河口市| 慈溪市| 手游| 正宁县| 祁阳县| 芮城县| 揭东县| 康平县| 宾阳县| 东乡族自治县| 深州市| 安顺市| 历史| 宜黄县| 高平市| 舞阳县| 台江县| 甘德县| 景东| 抚顺市| 九江市| 彭阳县| 类乌齐县| 庆元县| 临颍县| 项城市| 商水县| 滁州市| 石城县| 江西省| 温州市|