首頁>
3
回覆列表
  • 1 # 食鹽的故事

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

    示例:

    輸出

    結論:通過情況1和結果可以看出,子線程繼承父線程值時,得父線程已經初始化過值後,否則子線程則自身調用initialValue()來初始化數值,並且不走childParent方法,此時與使用ThreadLocal(用於聲明每個線程自身獨有的值)無異。

    子線程在父線程已經初始化值的情況下,不調用initiaValue()方法來初始化值,而是走childValue來返回數值,無論是否重寫過該方法,因為該方法本身就是返回父線程的數值。下面是該方法的源碼,可以看到是返回parentValue的值。

  • 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

    ```