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());
}
运行结果: