ThreadLocal
Posted jackie-zhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThreadLocal相关的知识,希望对你有一定的参考价值。
线程局部变量。
在非主线程中直接new Handler() 会报如下的错误: E/androidRuntime( 6173): Uncaught handler: thread Thread-8 exiting due to uncaught exception E/AndroidRuntime( 6173): java.lang.RuntimeException: Can‘t create handler inside thread that has not called Looper.prepare() 原因是非主线程中默认没有创建Looper对象,需要先调用Looper.prepare()启用Looper。
举例:
package test; import test.*; public class Test { static final ThreadLocal<ThreadValue> mThreadLocal = new ThreadLocal<ThreadValue>(); /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ThreadValue threadValue = new ThreadValue("主线程"); mThreadLocal.set(threadValue); System.out.print("in main thread : mThreadLocal:" + mThreadLocal +" "); System.out.print("in main thread : 名字:" + mThreadLocal.get().name +" "); mThreadLocal.get().print(); new Thread(new Runnable() { @Override public void run() { ThreadValue childThreadValue = new ThreadValue("子线程"); mThreadLocal.set(childThreadValue); System.out.print("in child thread : mThreadLocal:" + mThreadLocal +" "); System.out.print("in child thread : 名字:" + mThreadLocal.get().name +" "); mThreadLocal.get().print(); } }).start(); } } package test; public class ThreadValue { String name; public ThreadValue() { } public ThreadValue(String name) { this.name=name; } public void print() { System.out.print("this = " + this+" "); } }
结果:
然后编译:javac test/*.java 运行:java test.Test 输出: in main thread : mThreadLocal:[email protected] in main thread : 名字:主线程 this = [email protected] in child thread : mThreadLocal:[email protected] in child thread : 名字:子线程 this = [email protected]
可以看出由于mThreadLocal定义为静态最终变量,所以在主线程和子线程中,mThreadLocal都是同一个实例。
但是在两个线程中调用mThreadLocal.get(),得到的ThreadValue对象却并不相同。
这是因为mThreadLocal.get(),取到的对象是线程内的局部变量,相互之间并不干扰。
---------------------
作者:??-D-Luffy
来源:CSDN
原文:https://blog.csdn.net/zyfzhangyafei/article/details/64927617
版权声明:本文为博主原创文章,转载请附上博文链接!
以上是关于ThreadLocal的主要内容,如果未能解决你的问题,请参考以下文章