测试代码如下:
需要注意执行到构造函数和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(); 也正是利用这样的特性
正是利用了这样的特点
来源:oschina
链接:https://my.oschina.net/u/177808/blog/184348