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.csdn.net/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());
    }

运行结果:

猜你喜欢

转载自blog.csdn.net/Android_hv/article/details/81391610