如何为 parallelStream 设置 ThreadLocal

Aki*_*aMK 5 java multithreading thread-local java-8 java-stream

我有一个线程,它包含ThreadLocal变量。我需要parallelStream()在上面提到的线程中使用。需要调用myService哪个使用线程局部变量。有什么机制可以在java8.x中ThreadLocal使用parallelstream()时设置?

List<MyObject> result = myList.parallelStream().map(myObject -> {
    //call myService with the Threadlocal 
}).filter(...)
.....;
Run Code Online (Sandbox Code Playgroud)

Par*_*mal 0

您可以在调用服务之前轻松设置 threadLocal 变量。在映射中,您可以设置主线程本地值或任何其他值的值。

 ThreadLocal<String> threadLocal= new ThreadLocal<>();

        IntStream.range(0, 8).parallel().forEach(n -> {
            threadLocal.set("MAIN");
            System.out.println("This is sequence access "+n);
            System.out.printf("Service used ThreadLocal - %d: %s\n", n, threadLocal.get());
        });
Run Code Online (Sandbox Code Playgroud)

结果:

This is sequence access 5
This is sequence access 7
Parallel Consumer - 5: MAIN
Parallel Consumer - 7: MAIN
This is sequence access 4
This is sequence access 6
Parallel Consumer - 4: MAIN
Parallel Consumer - 6: MAIN
This is sequence access 2
This is sequence access 1
Parallel Consumer - 2: MAIN
This is sequence access 0
This is sequence access 3
Parallel Consumer - 0: MAIN
Parallel Consumer - 1: MAIN
Parallel Consumer - 3: MAIN
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个有用的答案。该技术在这个简单的示例中有效,其中所有代码都位于同一个位置;但既然如此,为什么有人会使用 ThreadLocal 呢?在真实的系统中,您使用 ThreadLocal 在调用堆栈的底部设置一些上下文,因此您不必将该上下文作为参数从一个方法传递到另一个方法,直到它最终到达所在的位置并行流执行。其中一些干预方法可能位于您甚至无法控制且无法修改的代码中。 (6认同)