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