zoukankan      html  css  js  c++  java
  • Threadlocal 传递参数(百度二面)

    去百度面试,二面的时候 面试官问 如果我想跟踪一个请求,从接收请求,处理到返回的整个流程,有没有好的办法,后来面试官说了 Threadlocal 可以做到传递参数。

    这是ThreadLocal的一个功能。很多人可能不知道,因为threadlocal 是局部变量,只要线程不销毁,就会一直存在,因此可以使用threadlocal来跟踪传递参数;

    如果对ThreadLocal一点都不了解的话,可以先参考这篇文章:ThreadLocal 定义,以及是否可能引起的内存泄露(threadlocalMap的Key是弱引用,用线程池有可能泄露)

    方法如下:

    最近在项目中使用到了JDK提供的线程池,遇到了在多线程环境下在线程内部共享数据的问题

    使用ThreadLocal 来解决线程内部共享数据的问题 

     定义BO 

    package com.unicom.ucloud.aar.kettle.bo;
    
    import com.unicom.ucloud.aar.kettle.vo.KettleRunMessageVo;
    
    /**
     * @author jiaoyiping@gmail.com
     * @remark 
     */
    public class ThreadLocalMessage {
        private  ThreadLocal<KettleRunMessageVo> messages;
        
        private ThreadLocalMessage(){
            messages = new ThreadLocal<KettleRunMessageVo>();
        }
        
        public  KettleRunMessageVo getMessage() {
            return messages.get();
        }
    
        public  void setMessage(KettleRunMessageVo message) {
            messages.set(message);
        }
        
        private static ThreadLocalMessage threadLocalMessage = new ThreadLocalMessage();
        
        public static ThreadLocalMessage getInstance(){
            return threadLocalMessage;
        }
    }
    //在线程中使用
    KettleRunMessageVo message = ThreadLocalMessage.getInstance().getMessage();
            if(message==null)
            {
                message = new KettleRunMessageVo();
                
                ThreadLocalMessage.getInstance().setMessage(message);
            }
    使用message的set方法设置相应的值

    在同一个线程中的其他地方get这个message 得到相应的值
    参考:
  • 相关阅读:
    1.MySql安装
    struts文件上传、文件下载
    Java内存模型
    虚拟机类加载机制
    JAVA内存管理
    算法
    POI
    SSH项目(1)
    classpath路径和properties
    AngularJS路由实现单页面跳转
  • 原文地址:https://www.cnblogs.com/aspirant/p/9183920.html
Copyright © 2011-2022 走看看