• 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()); //"主线程"
        }
    }

  • 相关阅读:
    JQuery上传插件Uploadify使用详解
    jquery easyui datagrid使用参考
    easyui datagrid使用(好)
    灵活运用 SQL SERVER FOR XML PATH
    C# HttpRequest 中文编码问题
    echarts简单使用
    [bootstrap] 修改字体
    css :not 选择器
    [win7] 带网络的安全模式,启动QQEIMPlatform第三方服务
    [mysql] 添加用户,赋予不同的管理权限
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/14697944.html
Copyright © 2020-2023  润新知