Java 8 paralleler Stream und ThreadLocal

9

Ich versuche herauszufinden, wie ich einen ThreadLocal-Wert in Java-8-Parallel-Stream kopieren kann.

Wenn wir das bedenken:

%Vor%

Welche Ausgänge

%Vor%

Gibt es eine Möglichkeit für mich, die ThreadLocal-Methode von der main () -Methode in die Threads zu klonen, die für jede parallele Ausführung erzeugt werden?

So dass mein Ergebnis ist:

%Vor%

anstelle der ersten?

    
Anatoli Radoulov 25.11.2015, 21:33
quelle

1 Antwort

8

Wie Louis in den Kommentaren gesagt hat , Ihr Beispiel kann sehr gut reduziert werden, um den Wert einer lokalen Variablen im Lambda-Ausdruck

zu erfassen %Vor%

Es ist nicht offensichtlich aus Ihrem Beispiel, was die vollen Anwendungsfälle sind.

Wenn Sie genau wissen, welche Threads in Ihrem Hauptthread gestartet sein sollen, sollten Sie ein InheritableThreadLocal

  

Diese Klasse erweitert ThreadLocal , um Vererbung von Werten zu liefern   Übergeordneter Thread zu untergeordneten Thread : Wenn ein untergeordneter Thread erstellt wird, wird der   child erhält Anfangswerte für alle vererbbaren thread-local   Variablen, für die der Vater Werte hat.

Wenn in Ihrem Fall val als InheritableThreadLocal deklariert wird, da die Thread Instanzen, die für parallel() in ForkJoinPool#commonPool() erstellt wurden, träge erstellt werden, würden sie alle vom Wert set in main Methode (und Thread).

Dies wäre nicht der Fall, wenn Sie irgendwie den commonPool (oder den Pool, den die parallel terminal-Operation aufgerufen hat) verwendet haben, bevor Sie den InhertiableThreadLocal -Wert im Ursprungs-Thread setzen.

    
Sotirios Delimanolis 26.11.2015, 00:47
quelle