Java ThreadLocal正确理解

点点圈 提交于 2019-12-01 07:33:08

测试代码如下:

需要注意执行到构造函数和run方法当前的线程ID。以及在何时给ThreadLocal变量塞值。

package com.test.thread.local;
public class ThreadLocalTest {


//测试ThreadLocal
static ThreadLocal<String> threadLocalString = new ThreadLocal<String>();

static class Runer extends Thread{
public Runer(String name) {
//构造函数当前线程还是主线程Id
System.out.println("Constructor Thread Id: " +Thread.currentThread().getId());
threadLocalString.set("[---Thread Id---]: " +Thread.currentThread().getId() );
}
@Override
public void run() {
//run方法中是新的线程Id
System.out.println("Runing fun Thread Id : " + Thread.currentThread().getId());
threadLocalString.set("[---Thread Id---]: " +Thread.currentThread().getId() );
System.out.println("(Int)>>>>" + threadLocalString.get());
}
}
public static void main(String args[]){
//主线程ID
System.out.println("Main   Thread Id  : " +Thread.currentThread().getId());
new Runer("runner").start();
System.out.println("(out)>>>>" + threadLocalString.get());
}
}

---------------

ThreadLocal set方法参照:

    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

在struts,tomcat等框架中,都用到了ThreadLocal<>变量。

如这样能够获取

ActionContext actionContext = ActionContext.getContext(); 也正是利用这样的特性

正是利用了这样的特点

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!