Android 中 ThreadLocal使用示例
Android 中 ThreadLocal使用示例
概要:
Demo描述:
ThreadLocal使用示例.
关于ThreadLocal的官方文档描述
Implements a thread-local storage, that is, a variable for which each thread has its own value.
All threads share the same ThreadLocal object, but each sees a different value when accessing it,
and changes made by one thread do not affect the other threads.
The implementation supports null values.
该段文字描述了ThreadLocal的用途:
1.对于同一个变量(即ThreadLocal中保存的变量)对于不同的线程其值是不同的.
2 所有线程共享一个ThreadLocal对象,但是访问ThreadLocal对象中的变量时得到不同的值
3 某个线程修改了ThreadLocal对象中的变量值时不会影响到其他线程.
举个例子:
1 主线程中建立一个ThreadLocal对象(mThreadLocal) 2 在主线程中调用mThreadLocal的set()方法向mThreadLocal中保存一个字符串变量 3 在两个子线程中调用mThreadLocal的set()方法向mThreadLocal中保存一个字符串变量 4 在主线程中调用mThreadLocal的get()方法获取到mThreadLocal中为主线程保存字符串变量,发现其值未变.
ThreadLocal的使用在Looper类中得到很好的体现.保证了每个线程和一个Looper一一对应,并且每个Looper之间不受影响.
示例代码:
MainActivity如下:
package cc.cv;
import android.os.Bundle;
import android.app.Activity;
/**
* Demo描述:
* ThreadLocal使用示例.
* 关于ThreadLocal的官方文档描述
* Implements a thread-local storage, that is, a variable for which each thread has its own value.
* All threads share the same ThreadLocal object, but each sees a different value when accessing it,
* and changes made by one thread do not affect the other threads.
* The implementation supports null values.
* 该段文字描述了ThreadLocal的用途:
* 1 对于同一个变量(即ThreadLocal中保存的变量)对于不同的线程其值是不同的.
* 2 所有线程共享一个ThreadLocal对象,但是访问ThreadLocal对象中的变量时得到不同的值
* 3 某个线程修改了ThreadLocal对象中的变量值时不会影响到其他线程.
*
*
* 举个例子:
* 1 主线程中建立一个ThreadLocal对象(mThreadLocal)
* 2 在主线程中调用mThreadLocal的set()方法向mThreadLocal中保存一个字符串变量
* 3 在两个子线程中调用mThreadLocal的set()方法向mThreadLocal中保存一个字符串变量
* 4 在主线程中调用mThreadLocal的get()方法获取到mThreadLocal中为主线程保存字符串变量,发现其值未变.
*
*
* ThreadLocal的使用在Looper类中得到很好的体现.保证了每个线程和一个Looper一一对应,并且每个Looper之间不受影响.
*
*/
public class MainActivity extends Activity {
private static ThreadLocal<String mThreadLocal=new ThreadLocal<String ();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
testThreadLocal();
}
private void testThreadLocal(){
//在主线程中调用ThreadLocal的set()方法保存一个变量
mThreadLocal.set("haha");
System.out.println("ThreadLocal保存的主线的变量值:"+mThreadLocal.get());
new Thread(){
public void run() {
//在第一个子线程中调用ThreadLocal的set()方法保存一个变量
mThreadLocal.set("xixi");
System.out.println("ThreadLocal保存的第一个子线程的变量值:"+mThreadLocal.get());
};
}.start();
new Thread(){
public void run() {
//在第二个子线程中调用ThreadLocal的set()方法保存一个变量
mThreadLocal.set("heihei");
System.out.println("ThreadLocal保存的第二个子线程的变量值:"+mThreadLocal.get());
};
}.start();
try {
Thread.sleep(1000*2);
//验证在第一个和第二个子线程对于ThreadLocal存储的变量值的修改没有影响到ThreadLocal存的主线程变量
System.out.println("ThreadLocal保存的主线的变量值:"+mThreadLocal.get());
} catch (Exception e) {
}
}
}
main.xml如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity"
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" /
</RelativeLayout
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
- [WCF 4.0新特性] 默认终结点
- 三层架构之我见 —— 不同于您见过的三层架构。
- 来源于WCF的设计模式:可扩展对象模式[下篇]
- [WCF 4.0新特性] 标准终结点与无(.SVC)文件服务激活
- 我的数据访问类(第二版)—— for .net2.0 (二)
- 我的数据访问类(第二版)—— for .net2.0 (一)
- [WCF 4.0新特性] 路由服务[原理篇]
- 通过“访问多种数据库”的代码来学习多态!(.net2.0版)
- [WCF-Discovery] 客户端如何能够“探测”到可用的服务?
- WCF的安全审核——记录谁在敲打你的门
- Step By Step 一步一步写网站[1] —— 填加数据
- 五个解决方案让MongoDB拥有RDBMS的鲁棒性事务
- Step By Step 一步一步写网站[1] —— 帧间压缩,表单控件
- [WCF-Discovery]如何利用”发现代理”实现可用服务的实时维护?
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 深夜学算法之SkipList:让链表飞
- 自研安全工具之网页全链接爬取
- 实战远程文件同步(Remote File Sync)
- nginx cache的玩法
- PHP共享内存详解 前言
- 为了--force-pivoting参数,我问候了sqlmap开发者
- flexible array柔性数组、不定长的数据结构Struct详解
- 如何优雅打印nginx header和body
- Go的CSP并发模型实现:M, P, G
- Golang依赖管理工具:glide从入门到精通使用
- Redis的Multi的内幕真相
- shell expect权威指南和实战
- 3种方式限制ip访问Oracle数据库
- 服务发现之consul的介绍、部署和使用
- Mybatis处理查询map 为null 导致查询map无该key对象