ThreadLocal与InheritableThreadLocal的区别

ThreadLocal:实现一个线程本地的存储,也就是说,每个线程都有自己的局部变量。所有线程都共享一个ThreadLocal对象,但是每个线程在访问这些变量的时候能得到不同的值,每个线程可以更改这些变量并且不会影响其他的线程,并且支持null值。(Handlder中有使用ThreadLocal,EventBus中也有应用到的)

    private String TAG = "MainActivity.class";
    private ThreadLocal<String> threadLocal = new ThreadLocal();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        threadLocal.set("张三");
        new Thread("哒哒哒"){
            @Override
            public void run() {
                super.run();
                threadLocal.set("李四");
                getLocalDate();
            }
        }.start();
        new Thread("啦啦啦"){
            @Override
            public void run() {
                super.run();
                getLocalDate();
            }
        }.start();
        getLocalDate();
    }
    public void getLocalDate() {
        Log.d(TAG, "Thread:"+Thread.currentThread().getName()
                +"---------ThreadID:"+Thread.currentThread().getId()+"-------ThreadLocal获取的数据:"+threadLocal.get());

    }

得到的结果是:

从这里来看,当我们在主线程中给ThreadLocal 只在获取当前线程所赋值的数据,这样可以解决很多线程之间的逻辑处理,把他当线程中的一个变量来使用也很好。

针对源码分析:https://blog.youkuaiyun.com/singwhatiwanna/article/details/48350919

InheritableThreadLocal:使用大致与ThreadLocal的使用方法相同,只不过原理有些不同,内部处理时如果在主线程中给他赋值,在子线程中也可以获取,当然如果在子线程中赋值,也只是在当前线程中可以得到当前的赋值数据。

    private String TAG = "MainActivity.class";
    private InheritableThreadLocal<Integer> inheritableThreadLocal = new InheritableThreadLocal();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        inheritableThreadLocal.set(25);
        new Thread("哒哒哒"){
            @Override
            public void run() {
                super.run();
                inheritableThreadLocal.set(26);
                getLocalDate();
            }
        }.start();
        new Thread("啦啦啦"){
            @Override
            public void run() {
                super.run();
                getLocalDate();
            }
        }.start();
        getLocalDate();
    }
    public void getLocalDate() {
        Log.d(TAG, "Thread:"+Thread.currentThread().getName()
                +"---------ThreadID:"+Thread.currentThread().getId()+"-------InheritableThreadLocal获取的数据:"+inheritableThreadLocal.get());
    }

运行结果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值