Obtenga el valor en el threadLocal del hilo padre en el hilo hijo de Java

Primero, obtenga el valor en el threadLocal del hilo padre en el hilo hijo de Java

threadLocal puede hacer aislamiento de datos a nivel de hilo, entonces, ¿cómo obtener el valor del hilo primario en el hilo secundario? Puede usar InheritableThreadLocal

/ ** 
 * Java 子 线程 获取 父 线程 的 threadLocal 中 的 值
 * / 
public class ThreadDemo1 { 

    public static final InheritableThreadLocal <String> heredableThreadLocal = new InheritableThreadLocal <> (); 

    public static final ThreadLocal <String> threadLocal = new ThreadLocal <> (); 

    public static void main (String [] args) lanza Exception { 
        inheritableThreadLocal.set ("inheritableThreadLocal hello"); 
        threadLocal.set ("mundo threadLocal"); 
        nuevo hilo (() -> { 
            System.out.println (String.format ("子 线程 可继承 值 :% s", heredableThreadLocal.get ())); 
            System.out.println (String.format ("子 线程: :% S ", threadLocal.get ()));

                System.out.println (String.format ("El hilo Sun puede heredar el valor:% s", 
                inheritableThreadLocal.get ( ))); System.out.println (String.format ("Valor del hilo Sun:% s", threadLocal. get ())); 


            }). start (); 

        }). start (); 


        Thread.sleep (3000); 
        System.out.println ("-------------- se puede modificar Valores heredados de 
        threadLocal y threadLocal -------------------- " 
        ); inheritableThreadLocal.set (" inheritableThreadLocal hello2 "); threadLocal.set (" threadLocal world2 "); 


        New Thread (() -> { 
            System.out.println (String.format ("El subproceso secundario puede heredar el valor:% s", 
            inheritableThreadLocal.get ( ))); System.out.println (String.format ("Subproceso secundario Valor:% s ", threadLocal.get ()));

            Hilo nuevo (() -> {
                System.out.println (String.format ("El hilo Sun puede heredar el valor:% s", 
                inheritableThreadLocal.get ( ))); System.out.println (String.format ("Valor del hilo Sun:% s", threadLocal. get ())); 


            }). start (); 

        }). start (); 
    } 
}

  

El resultado es el siguiente:

Valor heredado del 
subproceso secundario : herencia heredable Valor del subproceso secundario hola : nulo 
nieto valor heredado del 
subproceso: 
heredableThreadLocal valor del subproceso secundario nieto: nulo -------------- Modificar los valores heredables de threadLocal y threadLocal- ------------------- 
Valor heredado del 
subproceso secundario: inheritableThreadLocal hello2 Valor del subproceso secundario : nulo 
valor del subproceso del nieto heredable: heredableThreadLocal 
valor del subproceso del nieto hello2 : nulo

 Explique que el valor heredableThreadLocal del subproceso principal se puede obtener en el subproceso secundario y el subproceso de nieto. Después de modificar el valor de inheritableThreadLocal, también se puede obtener el valor de inheritableThreadLocal del subproceso principal en el subproceso secundario y el subproceso de nieto.

Pero threadLocal no funciona, el valor obtenido está vacío.

 

2. Ver el código fuente para crear Thread

private void init (ThreadGroup g, Runnable target, String name, 
                      long stackSize, AccessControlContext acc, 
                      boolean heredeThreadLocals) { 
        ...... 
        if (heredeThreadLocals && parent.inheritableThreadLocals! = null) 
            this.inheritableThreadLocals = 
                ThreadLocal.createInherited. heredableThreadLocals); 
        / * Guarde el tamaño de pila especificado en caso de que la VM se preocupe * / 
        this.stackSize = stackSize; 

        / * Establecer ID de hilo * / 
        tid = nextThreadID (); 
    } 

    //ThreadLocal.createInheritedMap  
    estático ThreadLocalMap createInheritedMap (ThreadLocalMap parentMap) {
        return new ThreadLocalMap (parentMap); 
    }

  Se puede ver que cuando se crea el subproceso, se llama al método init, y luego se heredan los hebrables ThreadLocals del subproceso primario a herenciabitableThreadLocals (ThreadLocal.ThreadLocalMap heredableThreadLocals = nulo;)

 

Supongo que te gusta

Origin www.cnblogs.com/linlf03/p/12687457.html
Recomendado
Clasificación