阿里开源TransmittableThreadLocal避坑

前言

     最近优化公司项目一个功能,由于牵涉到数据量比较大,业务复杂,之前单线程执行响应时间比较久,大概10s左右。优化的思路,想到了多线程执行。

      由于业务中使用了ThreadLocal,它是来解决变量在多线程使用相互影响问题,ThreadLocal能够做到变量在多线程间隔离,是因为每个线程将变量存储到自己的threadLocals(ThreadLocal.ThreadLocalMap类型)中。如果使用多线程话,需要解决父子线程值传递问题,想到了InheritableThreadLocal,它是将变量存储在inheritableThreadLocals,在创建子线程时,会将父线程值传递到子线程。似乎使用InheritableThreadLocal问题不大,在本地调试过程也不会有什么问题,测试环境执行会出现部分线程 InheritableThreadLocal 拿不到值问题,这是因为忘记了环境因素,现在项目不可能显示穿件线程,基本都有自己的线程池。InheritableThreadLocal 在set值时,线程池中部分线程是已经存活着的,所有这部分线程inheritableThreadLocals变量中是不可能有父线程传递过来的值,因为压根不存在创建过程。

   由于线程池的问题,想到了阿里开源的TransmittableThreadLocal  简称ttl。

过程

先看下我自己创建的测试类

public class TransmittableThreadLocalTest {
    private static ExecutorService executorService = Executors.newFixedThreadPool(1);
    private static ThreadLocal<Map<String,String>> threadLocal=new TransmittableThreadLocal<Map<String,String>>();


    public static void main(String[] args) {
        Map<String, String> map = threadLocal.get();
        if (map == null) {
            threadLocal.set(new HashMap<>());
        }

        threadLocal.get().put("test", "test");
        executorService.submit(TtlRunnable.get(new Runnable() {
            @Override
            public void run() {
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {

                }
                System.out.println("子线程获取的值:" + threadLocal.get());
            }
        }));
        threadLocal.get().put("second", "second");
        Map mainValue = threadLocal.get();
        System.out.println("主线程获取的值&#
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
WeChatBot是阿里开源的一个文件,它是一个基于微信的聊天机器人项目。作为一个开源项目,WeChatBot可以让开发者在自己的微信号上实现聊天机器人的功能。 WeChatBot的特点主要有以下几个方面。首先,它支持多种消息类型的处理,如文本、图片、语音等。这意味着用户可以通过微信发送各种类型的消息给机器人,并获得相应的回复。 其次,WeChatBot提供了灵活的自定义功能。开发者可以根据自己的需要,通过编写插件来扩展机器人的功能。这使得WeChatBot变得非常灵活,可以在各种场景下使用。 此外,WeChatBot还支持多线程处理消息,从而提高了处理消息的效率。这对于处理大量消息的场景非常重要,可以保证机器人的响应速度和稳定性。 值得一提的是,WeChatBot还支持对话状态的管理。它可以保存用户的对话历史,从而能够根据用户之前的回答或提问来作出更准确的回复。这使得机器人能够更好地理解用户的意图,并提供更个性化的服务。 最后,WeChatBot是基于Python语言开发的,使用了wxpy库作为微信接口的封装。Python是一种简洁而强大的编程语言,拥有丰富的第三方库和工具。而wxpy库则提供了方便易用的微信接口,使得开发者可以更加便捷地开发和部署自己的聊天机器人。 总结来说,WeChatBot是一个功能丰富、灵活可扩展的聊天机器人项目。它的开源性使得开发者可以根据自己的需求进行二次开发和定制,为用户提供更好的聊天体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值