ThreadLocal用于提供线程私有的变量,即:一个变量,虽然是共享的,但是使用该变量的各个线程又可以都不一样。
看一个栗子:
public class ThreadLocalTest {
public static void main(String[] args) {
PushStoreThread thread1 = new PushStoreThread("Kaifeng");
PushStoreThread thread2 = new PushStoreThread("Luoyang");
thread1.start();
thread2.start();
}
/**
* 持有共享变量的类
*
*/
public static class StoreHolder {
public static ThreadLocal<String> something = new ThreadLocal<String>() {
// 初始化
protected String initialValue() {
return "xx";
};
};
}
/**
* 线程类
*
*/
public static class PushStoreThread extends Thread {
String name;
public PushStoreThread(String name) {
this.name = name;
}
@Override
public void run() {
// 首次get时,调用initialValue()
System.out.println(Thread.currentThread().getId() + "Run1: " + StoreHolder.something.get());
StoreHolder.something.set(this.name);
System.out.println(Thread.currentThread().getId() + "Run2: " + StoreHolder.something.get());
}
}
}
简单说明下:
(1)main是主线程入口,用于开启线程
(2)StoreHolder持有共享变量(共享即static)。实例化时重写了initialValue(),但这个是可选的,如果不重写,那么初始值为null。
(3)PushStoreThread即线程类,该类需要使用StoreHolder中的共享变量。其中get()用于获取值,set()用于设置值,另外还有remove()用于移除。