-
1 # 食鹽的故事
-
2 # HJunW
`InheritableThreadLocal` 是 Java 中的一個線程本地變量類,可以讓變量在子線程中被繼承並使用。使用 `InheritableThreadLocal` 可以在一個線程裡設置變量的值,在其它子線程中使用該變量的值。
下面是 `InheritableThreadLocal` 的使用方法:
1. 定義 `InheritableThreadLocal` 變量:
```java
public static final InheritableThreadLocal<String> threadVar = new InheritableThreadLocal<>();
```
2. 在主線程中設置變量的值:
```java
threadVar.set("value from main thread");
```
3. 在子線程中獲取變量的值:
```java
String value = threadVar.get();
```
如果在子線程中未設置過該變量的值,則獲取的值為父線程中的值。
完整示例代碼:
```java
public class InheritableThreadLocalTest {
public static final InheritableThreadLocal<String> threadVar = new InheritableThreadLocal<>();
public static void main(String[] args) {
threadVar.set("value from main thread");
Thread childThread = new Thread(() -> {
System.out.println("child thread: " + threadVar.get());
threadVar.set("value from child thread");
System.out.println("child thread: " + threadVar.get());
});
childThread.start();
try {
childThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main thread: " + threadVar.get());
}
}
```
輸出結果為:
```
child thread: value from main thread
child thread: value from child thread
main thread: value from main thread
```
回覆列表
InheritableThreadLocal用於子線程繼承父線程的數值。將通過重寫initialValue() 與childValue(Object parentValue)兩個方法來展示例子。
其中initialValue()是InheritableThreadLocal類繼承於ThreadLocal類的,用於初始化當前線程私有初始值,childValue(Object parentValue)是InheritableThreadLocal類的,作用是繼承父線程的初始值並且進一步處理。
示例:
輸出
結論:通過情況1和結果可以看出,子線程繼承父線程值時,得父線程已經初始化過值後,否則子線程則自身調用initialValue()來初始化數值,並且不走childParent方法,此時與使用ThreadLocal(用於聲明每個線程自身獨有的值)無異。
子線程在父線程已經初始化值的情況下,不調用initiaValue()方法來初始化值,而是走childValue來返回數值,無論是否重寫過該方法,因為該方法本身就是返回父線程的數值。下面是該方法的源碼,可以看到是返回parentValue的值。