InheritableThreadLocal的使用


InheritableThreadLocal用於子線程繼承父線程的數值。將通過重寫initialValue() 與childValue(Object parentValue)兩個方法來展示例子。
其中initialValue()是InheritableThreadLocal類繼承於ThreadLocal類的,用於初始化當前線程私有初始值,childValue(Object parentValue)是InheritableThreadLocal類的,作用是繼承父線程的初始值並且進一步處理。
例子:


IhThreadLocal.Java

/**
 * author:allenstarkx
 * description:繼承InheritableThreadLocal方法,並且重寫初始化線程數值方法與修改子線程數值方法
 *
 */
public class IhThreadLocal extends InheritableThreadLocal {
    @Override
    protected Object initialValue() {
        return new Date().getTime();
    }

    @Override
    protected Object childValue(Object parentValue) {
        return parentValue+"已被修改";
    }

}

IhThreadLocalUse.java

/**
 * author:allenstarkx
 * description:靜態調用IhThreadLocal
 */
public class IhThreadLocalUse {
    public static IhThreadLocal ihThreadLocal1 = new IhThreadLocal();
}

ThreadIH.java

/**
 * author:allenstarkx
 * description:輸出子線程的IhThreadLocalUse的值
 */
public class ThreadIH extends Thread {
    @Override
    public void run() {
        try{
            for (int i = 0; i < 2; i++) {
                System.out.println(IhThreadLocalUse.ihThreadLocal1.get());
                Thread.sleep(100);
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

IhThreadLocalTest.java

/**
 * author:allenstarkx
 * description:父線程輸出IhThreadLocalUse的值與分兩次創建子線程查看內IhThreadLocalUse的值
 */
public class IhThreadLocalTest {
    public static void main(String[] args) {
        try{
            //情況1:在父類初始化IhThreadLocal前子線程先執行子線程
            ThreadIH ih1 = new ThreadIH();
            ih1.start();

            //情況2:在父線程初始化IhThreadLocal后執行子線程
            Thread.sleep(1000);
            for (int i = 0; i < 2; i++) {
                System.out.println("父線程"+IhThreadLocalUse.ihThreadLocal1.get());
            }
            ThreadIH ih2 = new ThreadIH();
            ih2.start();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}
先貼出運行結果


相關類說明在每個方法都有寫明,以下是相關結論:

  1. 通過情況1和結果可以看出,子線程繼承父線程值時,得父線程已經初始化過值后,否則子線程則自身調用initialValue()來初始化數值,並且不走childParent方法,此時與使用ThreadLocal(用於聲明每個線程自身獨有的值)無異。
  2. 子線程在父線程已經初始化值的情況下,不調用initiaValue()方法來初始化值,而是走childValue來返回數值,無論是否重寫過該方法,因為該方法本身就是返回父線程的數值。下面是該方法的源碼,可以看到是返回parentValue的值。


免責聲明!

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



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