ThreadLocal+TaskDecorator实现父子线程 参数传递

一、背景

我自定义注解,在切面中实现动态数据源切换,但是目标方法中新开线程使用异步的方式执行,导致在切面中主线程切换数据源参数,无法在异步的目标方法中使用。

二、实现方式

1、创建UserUtils类。

public class UserUtils {
   
    private static  final  ThreadLocal<String> userLocal=new ThreadLocal<>();

    public static  String getUserId(){
   
        return userLocal.get();
    }
    public static void setUserId(String userId){
   
        userLocal.set(userId);
    }

    public static void clear(){
   
        userLocal.remove();
    }
}

2、自定义TaskDecorator类型的类

public class CustomTaskDecorator implements TaskDecorator {
   
    @Override
    public Runnable decorate(Runnable runnable) {
   
        // 获取主线程中的请求信息(我们的用户信息也放在里面)
        String robotId = UserUtils.getUserId();
        return () -> {
   
            try {
   
                // 将主线程的请求信息,设置到子线程中
                UserUtils.setUserId(robotId);
                // 执行子线程,这一步不要忘了
                runnable.run();
            } finally {
   
                // 线程结束,清空这些信息,否则可能造成内存泄漏
                UserUtils.clear();
            }
        };
    }
}

3、创建测试类,此方法依赖线程池,并需要在创建线程池类时,setTaskDecorator把自己的TaskDecorator类设置进去。

public class CreatePassword {
   
    public static void main(String[] args) {
   
        try{
   
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setTaskDecorator(new CustomTaskDecorator());
            executor.initialize();
            //InheritableThreadLocal存储
           ThreadLocal<String> username = new ThreadLocal<>();
            for (int i = 0; i < 2; i++) {
   
                UserUtils.setUserId("用户id:"+i);
                Thread.sleep(3000);
                CompletableFuture.runAsync(()-> System.out.println(UserUtils.getUserId()),executor);
            }
        }catch (Exception e){
   

        }
    }
}

4、测试结果

用户id:0
用户id:1

相关推荐

  1. ThreadLocal+TaskDecorator实现父子线 参数传递

    2023-12-07 04:52:05       38 阅读
  2. python获取线名称和传递参数,数据共享

    2023-12-07 04:52:05       32 阅读
  3. 【6】c++多线技术之线参数传递

    2023-12-07 04:52:05       18 阅读
  4. 线池的参数 以及实现

    2023-12-07 04:52:05       14 阅读
  5. vue实现axios和事件Bus等父子组件的事件传递实现

    2023-12-07 04:52:05       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 04:52:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 04:52:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 04:52:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 04:52:05       18 阅读

热门阅读

  1. 【无标题】

    2023-12-07 04:52:05       47 阅读
  2. a href自定义下载文件名

    2023-12-07 04:52:05       42 阅读
  3. 设计模式&委派模式(Delegate Pattern)

    2023-12-07 04:52:05       33 阅读
  4. 【LeetCode】258. 各位相加

    2023-12-07 04:52:05       36 阅读
  5. Vue中的组件通信:从子到父的数据传递

    2023-12-07 04:52:05       40 阅读
  6. C++设计模式——建造者模式(Builder)

    2023-12-07 04:52:05       44 阅读
  7. ES6拓展API

    2023-12-07 04:52:05       32 阅读
  8. Socket.D 网络应用协议,首版发布!

    2023-12-07 04:52:05       38 阅读
  9. 字符指针变量

    2023-12-07 04:52:05       38 阅读
  10. 数据结构-基数排序

    2023-12-07 04:52:05       42 阅读
  11. 利用 Python 进行数据分析实验(二)

    2023-12-07 04:52:05       40 阅读