Clase Java.lang.InheritableThreadLocal con ejemplos

La clase java.lang.InheritableThreadLocal amplía ThreadLocal para proporcionar la herencia de valores del subproceso principal al secundario: cuando se crea un subproceso secundario, el secundario recibe valores iniciales para todas las variables locales de subproceso heredables para las que el principal tiene valores.

Subproceso principal , la variable ThreadLocal de forma predeterminada no está disponible para el subproceso secundario.
Constructor :

InheritableThreadLocal gfg_tl = new InheritableThreadLocal();

Es la clase secundaria de ThreadLocal y, por lo tanto, todos los métodos presentes en ThreadLocal están disponibles de forma predeterminada para InheritableThreadLocal .
Contiene un solo método:
Sintaxis:

public Object childValue(Object parentValue) 

Este método se llama (se anula) dentro del subproceso principal antes de que se inicie el subproceso secundario.

  • Si queremos que el subproceso principal, el valor de la variable local del subproceso esté disponible para el subproceso secundario, entonces debemos optar por la clase InheritableThreadLocal .
  • De forma predeterminada, el valor del subproceso secundario es exactamente el mismo que el valor del subproceso principal. Pero podemos proporcionar nuestro propio valor personalizado para subprocesos secundarios anulando el método childValue .

Ejemplo:

// Java program to illustrate parent thread, ThreadLocal variable
// by default not available to child thread
  
class ParentThread extends Thread {
    public static ThreadLocal gfg_tl = new ThreadLocal();
    public void run()
    {
  
        // setting the new value
        gfg_tl.set("parent data");
  
        // returns the ThreadLocal value associated with current thread
        System.out.println("Parent  Thread Value :" + gfg_tl.get());
  
        ChildThread gfg_ct = new ChildThread();
        gfg_ct.start();
    }
}
  
class ChildThread extends Thread {
    public void run()
    {
  
        // returns  the ThreadLocal value associated with current thread
        System.out.println("Child Thread Value :" + ParentThread.gfg_tl.get());
        /* null (parent thread variable 
        thread local value is not available to child thread ) */
    }
}
class ThreadLocalDemo {
    public static void main(String[] args)
    {
        ParentThread gfg_pt = new ParentThread();
        gfg_pt.start();
    }
}
Output:
Parent Thread Value:parent data
Child Thread Value:null (by default initialValue is null)
// Java program to illustrate inheritance of customized value
// from parent thread to child thread
  
class ParentThread extends Thread {
    // anonymous inner class  for overriding childValue method.
    public static InheritableThreadLocal gfg_tl = new InheritableThreadLocal() {
        public Object childValue(Object parentValue)
        {
            return "child data";
        }
    };
    public void run()
    {
        // setting the new value
        gfg_tl.set("parent data");
        // parent data
        System.out.println("Parent Thread Value :" + gfg_tl.get());
  
        ChildThread gfg_ct = new ChildThread();
        gfg_ct.start();
    }
}
class ChildThread extends Thread {
  
    public void run()
    {
        // child data
        System.out.println("Child Thread Value :" + ParentThread.gfg_tl.get());
    }
}
class ThreadLocalDemo {
  
    public static void main(String[] args)
    {
        ParentThread gfg_pt = new ParentThread();
        gfg_pt.start();
    }
}
Output:
Parent Thread Value:parent data 
Child Thread Value:child data

1er escenario : en el programa anterior, si reemplazamos InheritableThreadLocal con ThreadLocal y no estamos anulando el método childValue, entonces el resultado es:

Output:
Parent Thread Value: parent data 
Child Thread Value:null   (by default initialValue is null)

2do escenario : en el programa anterior, si mantenemos InheritableThreadLocal y no reemplazamos el método childValue, entonces el resultado es:

Output :
Parent Thread Value:parent data 
Child Thread Value:parent data

3.er escenario : en el programa anterior, si mantenemos InheritableThreadLocal y también reemplazamos el método childValue, el resultado es:

Output:
Parent Thread Value:parent data 
Child Thread Value:child data

Publicación traducida automáticamente

Artículo escrito por Vinay Pathak y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *