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