Android开发之ThreadLocal的使用
来源:互联网 发布:大数据风控平台排名 编辑:程序博客网 时间:2024/05/29 16:24
1 前言
今天在学习handler源码,发现了handlder中使用了ThreadLocal。不但如此,在开源框架EventBus中也使用了ThreadLocal,所以对这个ThreadLocal做了一个研究,这里做一个总结,为一下篇handler讲解打下基础。
2 什么是ThreadLocal
官网:实现一个线程本地的存储,也就是说,每个线程都有自己的局部变量。所有线程都共享一个ThreadLocal对象,但是每个线程在访问这些变量的时候能得到不同的值,每个线程可以更改这些变量并且不会影响其他的线程,并且支持null值。
简单来说:ThreadLocal里面存储一个变量,供多个线程来访问共享。但是每一个线程改变了这个变量并不会影响其他的线程中变量的值。这就是ThreadLocal的神奇所在,让我们赶紧来学习一下吧。
3 ThreadLocal API介绍
ThreadLocal的API很简单,常用的就4个方法,下面我们来介绍一下:
值得一提的是,在JDK5.0中,ThreadLocal已经支持泛型,该类的类名已经变为ThreadLocal。API方法也相应进行了调整,新版本的API方法分别是void set(T value)、T get()以及T initialValue()。下面我们做一个例子来介绍一下它的使用。
4 ThreadLocal实战
下面我们做一下例子来深入理解一下:
4.1 代码
我们启用3个线程。每个线程利用for循环打印5个数据。注意,我们想要是结果是:它们之间互相不影响。代码如下
public class MainActivity extends AppCompatActivity { private ThreadLocal<Integer>mThreadLocal; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mThreadLocal = new ThreadLocal<Integer>(){ @Override protected Integer initialValue() { return 0; } }; MyThread myThread1 = new MyThread("线程1"); MyThread myThread2 = new MyThread("线程2"); MyThread myThread3 = new MyThread("线程3"); myThread1.start(); myThread2.start(); myThread3.start(); } private class MyThread extends Thread{ public MyThread(String name){ super(name); } @Override public void run() { super.run(); for(int i=0;i<5;i++){ Integer num = mThreadLocal.get(); Log.d("mystudy",this.getName()+":"+num); mThreadLocal.set(++num); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }}
4.2结果
由图中可以看出,3个线程并没有相互影响,各自打印自己的。
5总结
虽然我们多个线程共享一个ThreadLocal中的变量,但是ThreadLocal会分别给每个线程一个变量的副本,导致多个线程之间互不影响。
6 结尾
好了就讲到这里吧,在技术上我依旧是个小渣渣,加油!勉励自己!
- Android开发之ThreadLocal的使用
- Android之ThreadLocal的理解
- 理解Android之ThreadLocal
- android之ThreadLocal详解
- Android多线程之ThreadLocal
- android ThreadLocal使用
- Android开发笔记1:Handler、Looper、ThreadLocal的那些事
- Android 的ThreadLocal 详解
- ThreadLocal的使用- -
- ThreadLocal的使用
- ThreadLocal 的使用
- ThreadLocal的使用
- 关于ThreadLocal的使用
- Threadlocal类的使用
- ThreadLocal的使用
- ThreadLocal的使用
- ThreadLocal的使用
- java ThreadLocal的使用
- android SQLite数据的使用
- videoView播放视频,简易视频播放器自己写
- 关于支付宝sdk出现Fatal error问题解决办法
- ionic2框架 图片选择与上传(支持ios,android)
- 链表算法之环形链表插值
- Android开发之ThreadLocal的使用
- C++上机作业5实验
- react 学习笔记
- 第121课:Spark Streaming性能优化:通过摄像头图像处理案例来说明Spark流处理性能评估新方法及性能调优参数调试
- mysql数据库备份与还原
- 高效传输数据格式以及基于HTTP2的RPC框架---gRPC的使用
- Android Studio的Log日志过滤
- AR截屏并显示
- 剑指offer——数组中重复的数字