3.4 类InheritableThreadLocal的使用

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

3.4.1 值继承
使用InheritableThreadLocal类可以让子线程从父线程中取得值。

/**
 * @author wuyoushan
 * @date 2017/5/24.
 */
public class InheritableThreadLocalExt extends InheritableThreadLocal {

    @Override
    protected Object initialValue() {
        return new Date().getTime();
    }
}

/**
 * @author wuyoushan
 * @date 2017/5/23.
 */
public class Tools {
    public static  InheritableThreadLocalExt t1=new InheritableThreadLocalExt();
}

/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class ThreadA extends Thread{

    @Override
    public void run() {
       try{
           for (int i = 0; i <10; i++) {
               System.out.println("在ThreadA线程中取值= "+Tools.t1.get());
               Thread.sleep(100);
           }
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
    }
}

/**
 * @author wuyoushan
 * @date 2017/3/20.
 */
public class Run {

    public static void main(String[] args) {
        try {
            for (int i = 0; i < 10; i++) {
                System.out.println("在Main线程中取值="+Tools.t1.get());
                Thread.sleep(100);
            }
            Thread.sleep(5000);
            ThreadA a=new ThreadA();
            a.start();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

程序的运行结果为:

在Main线程中取值=1495584062991
在Main线程中取值=1495584062991
在Main线程中取值=1495584062991
在ThreadA线程中取值= 1495584062991
在ThreadA线程中取值= 1495584062991
在ThreadA线程中取值= 1495584062991

3.4.2 值继承再修改
如果在值继承的同时还可以对值进行进一步的处理那就更好了。

/**
 * @author wuyoushan
 * @date 2017/5/24.
 */
public class InheritableThreadLocalExt extends InheritableThreadLocal {

    @Override
    protected Object initialValue() {
        return new Date().getTime();
    }

    @Override
    protected Object childValue(Object parentValue) {
        return parentValue+" 我在子线程加的~";
    }
}

/**
 * @author wuyoushan
 * @date 2017/5/23.
 */
public class Tools {
    public static  InheritableThreadLocalExt t1=new InheritableThreadLocalExt();
}

/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class ThreadA extends Thread{

    @Override
    public void run() {
       try{
           for (int i = 0; i <10; i++) {
               System.out.println("在ThreadA线程中取值= "+Tools.t1.get());
               Thread.sleep(100);
           }
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
    }
}

/**
 * @author wuyoushan
 * @date 2017/3/20.
 */
public class Run {

    public static void main(String[] args) {
        try {
            for (int i = 0; i < 10; i++) {
                System.out.println("在Main线程中取值="+Tools.t1.get());
                Thread.sleep(100);
            }
            Thread.sleep(5000);
            ThreadA a=new ThreadA();
            a.start();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

程序的运行结果为:

在Main线程中取值=1495584458175
在Main线程中取值=1495584458175
在Main线程中取值=1495584458175
在ThreadA线程中取值= 1495584458175 我在子线程加的~
在ThreadA线程中取值= 1495584458175 我在子线程加的~
在ThreadA线程中取值= 1495584458175 我在子线程加的~

但在使用InheritableThreadLocal类需要注意一点的是,如果子线程在取得值的同时,主线程将InheritableThreadLocal中的值进行更改,那么子线程取到的值还是旧值

摘选自 java多线程核心编程技术-3.4

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,891评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,760评论 18 399
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,141评论 0 62
  • 读书多的人对事物的看法总是恰到好处,而读书少的人总喜欢鸡蛋里挑骨头,因为读书少,所以见识少,说出的话也让人难以接受...
    秋苹果之秋荷阅读 646评论 8 3
  • 据说,智商太高的人,脑细胞都过度活跃,从而经常失眠,我想说的重点其实是失眠,不是在自诩智商高。 1、 这不,昨晚又...
    魔宁阅读 1,422评论 3 1