【问题标题】:How to set ThreadLocal for parallelStream如何为 parallelStream 设置 ThreadLocal
【发布时间】:2018-01-29 05:57:27
【问题描述】:

我有一个线程,它包含ThreadLocal 变量。我需要在上述线程中使用parallelStream()。需要调用使用线程局部变量的myService。在 java8 中使用parallelstream() 时是否有任何机制来设置ThreadLocal

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

【问题讨论】:

  • 请查看link,希望它能回答您的问题。
  • 请查看link 了解您的问题,希望对您有所帮助。
  • 如果 myService 依赖于线程局部变量,它很可能还没有准备好被多个线程调用。

标签: java multithreading java-8 java-stream thread-local


【解决方案1】:

您可以在调用服务之前轻松设置 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());
        });

结果:

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

【讨论】:

  • 这不是一个有用的答案。该技术适用于这个简单的示例,其中所有代码都在同一个位置;但在那种情况下,为什么会有人使用 ThreadLocal?在实际系统中,您使用 ThreadLocal 在调用堆栈的底部设置一些上下文,因此您不必将该上下文作为参数从一个方法传递到另一个方法,直到它最终到达并行流执行。其中一些干预方法可能位于您甚至无法控制且无法修改的代码中。
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 2014-09-18
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多