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