zoukankan      html  css  js  c++  java
  • java 多线程 :ThreadLocal 共享变量多线程不同值方案;InheritableThreadLocal变量子线程中自定义值,孙线程可继承

     

    ThreadLocal类的使用

    变量值的共享可以使用public static变量的形式,所有的线程都是用同一个public static变量。如果想实现每一个线程都有自己的值。该变量可通过ThreadLocal实现
    定义:ThreadLocal<T> name = new ThreadLocal<>();
    用法:
    • 用法1、变量在线程外定义,在线程执行体内.set()赋值。
    • 用法2、变量在定义时设置自动赋值的方法。在对应线程中运行时则自动赋值。
      ThreadLocal<T> name = new ThreadLocal<>(){
      @Override
      protected String initialValue() {
      return <T> t;
      }
      };

    取值:.get()

    用法1示例:

    import javax.management.relation.RelationNotFoundException;
    
    /**
     * @ClassName ThreadLocalExample
     * @projectName: object1
     * @author: Zhangmingda
     * @description: XXX
     * date: 2021/4/24.
     */
    public class ThreadLocalExample {
        private static ThreadLocal<String> name = new ThreadLocal<>();
    
        public static void main(String[] args) {
            Runnable r = () -> {
                String threadname = Thread.currentThread().getName();
                /**
                 * 线程运行时赋值
                 */
                name.set(threadname);
                System.out.println(name.get()); //不同的子线程对应子线程名,本例ABC
            };
            Thread thread = new Thread(r,"A");
            Thread thread2 = new Thread(r,"B");
            Thread thread1 = new Thread(r,"C");
            thread.start();
            thread1.start();
            thread2.start();
            System.out.println(name.get()); //主线程中没有赋值默认为null
        }
    }

    用法二示例:

    /**
     * @ClassName ThreadLocalInitialValue
     * @projectName: object1
     * @author: Zhangmingda
     * @description: XXX
     * date: 2021/4/24.
     */
    public class ThreadLocalInitialValue {
        /**
         * 定义ThreadLocal变量线程中运行自动初始化值
         */
        private static ThreadLocal<String> name = new ThreadLocal<>(){
            @Override
            protected String initialValue() {
                return Thread.currentThread().getName();
            }
        };
        public static void main(String[] args) {
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    System.out.println("我是" + name.get());
                }
            };
            Thread zhangsan = new Thread(r,"张三");
            Thread lisi = new Thread(r,"李四");
            zhangsan.start();
            lisi.start();
            System.out.println("main线程中,我是" + name.get());
        }
    }

    InheritableThreadLocal子线程中自定义值,孙线程可继承

    import java.io.Reader;
    import java.sql.SQLOutput;
    
    /**
     * @ClassName ThreadLocalSubThread
     * @projectName: object1
     * @author: Zhangmingda
     * @description: XXX
     * date: 2021/4/24.
     */
    public class ThreadLocalSubThread {
        /**
         * 定义变量时,设置自动赋值方法
         */
        private static ThreadLocal<String> name = new InheritableThreadLocal<>(){
            @Override
            protected String initialValue() {
                return Thread.currentThread().getName();
            }
        };
    
        public static void main(String[] args) {
            Runnable r = () -> {
                System.out.println("我是子线程:"+ name.get());//我是子线程:child
                Thread t = new Thread(){
                    @Override
                    public void run() {
                        System.out.println("我是孙线程,获取子线程变量值:"+ name.get());//也是child
                    }
                };
                t.start();
            };
            Thread thread = new Thread(r,"child");
            thread.start();
            name.set("主线程"); //主线程中手动赋值
            System.out.println("main线程中 name:" + name.get()); //"主线程"
        }
    }

  • 相关阅读:
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 3037 Saving Beans【Lucas定理】【模板题】【模板】【组合数取余】
    8.Math 对象
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/14697944.html
Copyright © 2011-2022 走看看