ThreadLocal和InheritableThreadLocal的区别

来源:互联网 发布:楠木鞋架淘宝 编辑:程序博客网 时间:2024/05/18 03:45

1、ThreadLocal
主要解决每个线程绑定自己的值,达到线程直接隔离。
1.1如果第一次访问没有设定初始值,返回为null
1.2线程直接的隔离性

//继承ThreadLocal类public class ThreadLocalExt extends ThreadLocal{}
//创建两个线程,分别设置自己的值public class ThreadA extends  Thread{    @Override    public void run() {        for(int i = 0; i < 10; i ++){            Tools.local.set("A:"+ i);            System.out.println("A:" + Tools.local.get());            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}public class ThreadB extends Thread{    @Override    public void run() {        for(int i = 0; i < 10; i ++){            Tools.local.set("B:"+ i);            System.out.println("B:" + Tools.local.get());            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}
public class Tools {    public static ThreadLocalExt local = new ThreadLocalExt();}
程序入口类:public class Run {    public static void main(String[] args) throws InterruptedException {        ThreadA t1 = new ThreadA();        t1.start();        ThreadB t2 = new ThreadB();        t2.start();    }}

运行结果

A:A:0BB:0BB:1A:A:1BB:2A:A:2A:A:3BB:3A:A:4BB:4A:A:5BB:5A:A:6BB:6A:A:7BB:7A:A:8BB:8BB:9A:A:9

1.3通过重写initialValue方法可以设置初始化值
2、InheriThreadLocalExt
2.1值继承子线程可以从父线程中取得值。

public class InheriThreadLocalExt  extends InheritableThreadLocal{    @Override    protected Object initialValue() {        return new Date().getTime();    }}
public class Tools {    public static  InheriThreadLocalExt local = new InheriThreadLocalExt();}
public class ThreadA extends  Thread{    @Override    public void run() {        for(int i = 0; i < 10; i ++){            System.out.println("A:" + Tools.local.get());            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}
public class Run {    public static void main(String[] args) throws InterruptedException {        for(int i = 0; i < 10; i ++){            System.out.println("Main方法中获取" + Tools.local.get());        }        ThreadA t1 = new ThreadA();        t1.start();    }}

运行结果:

Main方法中获取1494859232485Main方法中获取1494859232485Main方法中获取1494859232485Main方法中获取1494859232485Main方法中获取1494859232485Main方法中获取1494859232485Main方法中获取1494859232485Main方法中获取1494859232485Main方法中获取1494859232485Main方法中获取1494859232485A:1494859232492A:1494859232492A:1494859232492A:1494859232492A:1494859232492A:1494859232492A:1494859232492A:1494859232492A:1494859232492A:1494859232492

2.2注意:子线程取值的时候主线程将值进行更改,子线程读到的还是旧值。

原创粉丝点击