zoukankan      html  css  js  c++  java
  • Java多线程-ThreadLocal和InheritableThreadLocal的使用

    ThreadLocal类

    变量值的共享可以通过使用public static变量的形式。如果想每个线程都有自己的共享变量,可以通过JDK提供的ThreadLocal来实现。

    类 ThreadLocal 主要解决的就是每个线程绑定自己的值,可以将 ThreadLocal 类比喻成全局存放数据的盒子,盒子中可以存放每个线程的私有变量。

    示例:

    public class Test {
        public static void main(String[] args) {
            try {
                for (int i = 0; i < 5; i++) {
                    System.out.println("   在 Main 线程中取值 = " + ThreadLocalHolder.getInstance().get());
                    Thread.sleep(500);
                }
                Thread.sleep(2500);
                ThreadA a = new ThreadA();
                a.start();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        static class ThreadA extends Thread {
            @Override
            public void run() {
                try {
                    for (int i = 0; i < 5; i++) {
                        System.out.println("在 ThreadA 线程中取值 = " + ThreadLocalHolder.getInstance().get());
                        Thread.sleep(100);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        static class ThreadLocalHolder {
            private ThreadLocalHolder() {
            }
    
            public static ThreadLocal getInstance() {
                return ThreadLocalHolder.Holder.INSTANCE;
            }
    
            private static class Holder {
                static final ThreadLocalHolder.MyThreadLocal INSTANCE = new ThreadLocalHolder.MyThreadLocal();
            }
    
            /**
             * 集成 ThreadLocal,给每个线程的共享变量一个初始值
             */
            private static class MyThreadLocal extends ThreadLocal {
                @Override
                protected Object initialValue() {
                    return System.currentTimeMillis();
                }
            }
        }
    }

    运行结果如图:

    类InheritableThreaddLocal 的使用

    使用类 InheritableThreadLocal 可以在子线程中取得父线程继承下来的值。

    示例:

    public class Test {
        public static void main(String[] args) {
            try {
                for (int i = 0; i < 5; i++) {
                    System.out.println("   在 Main 线程中取值 = " + ThreadLocalHolder.getInstance().get());
                    Thread.sleep(500);
                }
                Thread.sleep(2500);
                ThreadA a = new ThreadA();
                a.start();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        static class ThreadA extends Thread {
            @Override
            public void run() {
                try {
                    for (int i = 0; i < 5; i++) {
                        System.out.println("在 ThreadA 线程中取值 = " + ThreadLocalHolder.getInstance().get());
                        Thread.sleep(100);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        static class ThreadLocalHolder {
            private ThreadLocalHolder() {
            }
    
            public static InheritableThreadLocal getInstance() {
                return ThreadLocalHolder.Holder.INSTANCE;
            }
    
            private static class Holder {
                static final ThreadLocalHolder.MyInheritableThreadLocal INSTANCE = new ThreadLocalHolder.MyInheritableThreadLocal();
            }
    
            /**
             * 集成 InheritableThreadLocal,给每个线程的共享变量一个初始值
             */
            private static class MyInheritableThreadLocal extends InheritableThreadLocal {
                @Override
                protected Object initialValue() {
                    return System.currentTimeMillis();
                }
            }
        }
    }

    运行结果如下:

  • 相关阅读:
    spingboot项目在windows环境中运行时接收参数及日志中文乱码
    应用node-webkit(NWJS)把BS架构的网址封装成桌面应用
    AndroidStudio离线打包MUI集成JPush极光推送并在java后端管理推送
    AndroidStudio离线打包MUI
    Centos7环境下搭建Nginx+Lua+Redis进行数据存取
    Nginx各项配置的含义
    MyBatis动态批量插入、更新Mysql数据库的通用实现方案
    spring+springMVC+Mybatis架构下采用AbstractRoutingDataSource、atomikos、JTA实现多数据源灵活切换以及分布式事务管理
    《spring boot》8.2章学习时无法正常启动,报“ORA-00942: 表或视图不存在 ”
    Win10系统使用Docker安装oracle并通过Navicat for oracle进行登录
  • 原文地址:https://www.cnblogs.com/lkc9/p/12560592.html
Copyright © 2011-2022 走看看