去百度面試,二面的時候 面試官問 若是我想跟蹤一個請求,從接收請求,處理到返回的整個流程,有沒有好的辦法,後來面試官說了 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 獲得相應的值參考: