ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适,他实现了线程的变量隔离,不同的线程可以维护自己的变量,
他在内部实现原理上比较简单,就是每个ThreadLocal内定义一个以自己线程名称为key的hashMap,在应用上非常广泛,struts2等框架的每一个Action请求都会被Web容器初始化为一个ActionContext。这样就实现了不同请求的隔离。
下面看一个Demo,通过Demo的演示大概就可以看到 ThreadLocal的应用。
主程序:
用作共享的参数类:
两个简单的service
输出结果如下:
[quote]
62481336
pool-1-thread-1 62481336
-1790656022
pool-1-thread-2 -1790656022
[/quote]
通过以上代码大概可以看到,A,B 两个线程实现了隔离,A打印出来的就是A线程初始化
的值。
顺便说一下:
上面的例子也用了下自己不太熟悉的1.5的多线程处理类。
同时在Mydata的实现了良好的封装。
ThreadLocal 可以用于session等的保存,有很广泛的用途。
他在内部实现原理上比较简单,就是每个ThreadLocal内定义一个以自己线程名称为key的hashMap,在应用上非常广泛,struts2等框架的每一个Action请求都会被Web容器初始化为一个ActionContext。这样就实现了不同请求的隔离。
下面看一个Demo,通过Demo的演示大概就可以看到 ThreadLocal的应用。
主程序:
/**
* @author job
*
*/
public class ThreadLocalTest {
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(2);
service.execute(new Runnable(){
public void run() {
Mydata.getMydata().setX(new Random().nextInt());
A.say();
}
});
service.execute(new Runnable(){
public void run() {
Mydata.getMydata().setX(new Random().nextInt());
B.say();
}
});
service.shutdown();
}
}
用作共享的参数类:
/**
* @author dingjob
*
*/
class Mydata {
private static ThreadLocal data = new ThreadLocal();
// 防止对象 被new,只能通过get的方法获得。
private Mydata(){
}
int x;
public static Mydata getMydata(){
Mydata mydata = (Mydata)data.get();
if(mydata ==null){
mydata = new Mydata();
data.set(mydata);
}
return mydata;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
}
两个简单的service
class A {
public static void say(){
System.out.println(Thread.currentThread().getName()+ Mydata.getMydata().getX());
}
}
/**
* @author dingjob
*
*/
class B {
public static void say(){
System.out.println(Thread.currentThread().getName()+ Mydata.getMydata().getX());
}
}
输出结果如下:
[quote]
62481336
pool-1-thread-1 62481336
-1790656022
pool-1-thread-2 -1790656022
[/quote]
通过以上代码大概可以看到,A,B 两个线程实现了隔离,A打印出来的就是A线程初始化
的值。
顺便说一下:
上面的例子也用了下自己不太熟悉的1.5的多线程处理类。
同时在Mydata的实现了良好的封装。
ThreadLocal 可以用于session等的保存,有很广泛的用途。