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 得到相應的值
參考:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM