去百度面试,二面的时候 面试官问 若是我想跟踪一个请求,从接收请求,处理到返回的整个流程,有没有好的办法,后来面试官说了 Threadlocal 能够作到传递参数。html
这是ThreadLocal的一个功能。不少人可能不知道,由于threadlocal 是局部变量,只要线程不销毁,就会一直存在,所以能够使用threadlocal来跟踪传递参数;面试
若是对ThreadLocal一点都不了解的话,能够先参考这篇文章:ThreadLocal 定义,以及是否可能引发的内存泄露(threadlocalMap的Key是弱引用,用线程池有可能泄露)多线程
方法以下:post
最近在项目中使用到了JDK提供的线程池,遇到了在多线程环境下在线程内部共享数据的问题url
使用ThreadLocal 来解决线程内部共享数据的问题 spa
定义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 获得相应的值参考: