Java 8の並列ストリームでThreadLocal値をコピーするにはどうすればいいですか?Java 8の並列ストリームとThreadLocal
我々は考えるのであれば、この:
public class ThreadLocalTest {
public static void main(String[] args) {
ThreadContext.set("MAIN");
System.out.printf("Main Thread: %s\n", ThreadContext.get());
IntStream.range(0,8).boxed().parallel().forEach(n -> {
System.out.printf("Parallel Consumer - %d: %s\n", n, ThreadContext.get());
});
}
private static class ThreadContext {
private static ThreadLocal<String> val = ThreadLocal.withInitial(() -> "empty");
public ThreadContext() {
}
public static String get() {
return val.get();
}
public static void set(String x) {
ThreadContext.val.set(x);
}
}
}
Main Thread: MAIN
Parallel Consumer - 5: MAIN
Parallel Consumer - 4: MAIN
Parallel Consumer - 7: empty
Parallel Consumer - 3: empty
Parallel Consumer - 1: empty
Parallel Consumer - 6: empty
Parallel Consumer - 2: empty
Parallel Consumer - 0: MAIN
を出力するには、私は、各並列のために生み出されているスレッドにmain()メソッドからのThreadLocalのクローンを作成するための方法はあります実行?
ようなので、私の結果であること:代わりに、最初の1の
Main Thread: MAIN
Parallel Consumer - 5: MAIN
Parallel Consumer - 4: MAIN
Parallel Consumer - 7: MAIN
Parallel Consumer - 3: MAIN
Parallel Consumer - 1: MAIN
Parallel Consumer - 6: MAIN
Parallel Consumer - 2: MAIN
Parallel Consumer - 0: MAIN
?
私はそうは思わないでしょう。しかし、この 'ThreadLocal'はなぜあなたのメインメソッドで作成されたのではなく、明示的にラムダに渡されたのでしょうか? –
ストリームを通過しようとしていますか?私はそれが悪いと聞いた。 – zapl