How to share data from Main Thread with Thread on the Common Pool

Viewed 57

My idea is to share data from the main to the child thread (from the thread pool).

I found InheritableThreadLocal

Below is my example:

public static void main(String[] args) {
    InheritableThreadLocal<String> inheritableThreadLocal =
        new InheritableThreadLocal<>();
    System.out.println("Thread name: " + Thread.currentThread().getName() + " - Set data into inheritableThreadLocal: " + "ABCXYZ");
    inheritableThreadLocal.set("ABCXYZ");
    System.out.println();

    List<Integer> listIndex = List.of(1, 2);
    listIndex
        .stream()
        .parallel()
        .map(index -> {
            System.out.println("Thread name: " + Thread.currentThread().getName() + " - Get data from inheritableThreadLocal : " + inheritableThreadLocal.get());
            return inheritableThreadLocal.get();
        })
        .collect(Collectors.toList());
}

When tested I have strange behavior when running this example in different Java versions.

Java 11.0.12:

Thread name: main - Set data into inheritableThreadLocal: ABCXYZ

Thread name: main - Get data from inheritableThreadLocal : ABCXYZ
Thread name: ForkJoinPool.commonPool-worker-3 - Get data from inheritableThreadLocal : ABCXYZ

Java 17.0.1:

Thread name: main - Set data into inheritableThreadLocal: ABCXYZ

Thread name: ForkJoinPool.commonPool-worker-1 - Get data from inheritableThreadLocal : null
Thread name: main - Get data from inheritableThreadLocal : ABCXYZ

I do not know why have different output on different Java version like this (The thread on the pool can not find any data from inheritableThreadLocal area).

Could anyone give me the answer?

0 Answers
Related