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的主要内容,如果未能解决你的问题,请参考以下文章

源代码系列02——ThreadLocal源码分析(基础篇)

java中的ThreadLocal详解及示例代码

ThreadLocal介绍

MyBatis基础:使用java提供的ThreadLocal类优化代码

Java 单线程代码ThreadLocal串值问题

ThreadLocal