先上代码吧。
package thread;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
/**
* 这样的map属于全局级别的,会冲突,而且这样的实现方法好像是1.3以前的方法
* @author Han
*/
public class MyThreadLocalDemo {
private static Map<Thread,String> map = new HashMap<Thread,String>();
private static String contextStr = "";
public static void set(String str){
//System.out.println(map.containsKey(Thread.currentThread()));
map.put(Thread.currentThread(), str);
}
public static String get(){
System.out.println(map.keySet());
return map.get(Thread.currentThread());
}
public static String getStr(){
return contextStr;
}
public static void setStr(String str){
contextStr = str;
}
public static void print(){
System.out.println(map);
}
public class MyThread extends Thread{
// public MyThread(String name){
// super(name);
// }
@Override
public void run() {
int i = new Random().nextInt(10);
String str = Thread.currentThread().getId()+","+i;
MyThreadLocalDemo.set(str);
MyThreadLocalDemo.setStr(str);
System.out.println("```threadlocal的值"+str);
System.out.println("```string的值"+str);
//System.out.println(Thread.currentThread());
try {
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("`threadlocal的值"+MyThreadLocalDemo.get());
System.out.println("`String的值"+MyThreadLocalDemo.getStr());
//print();
}
}
public static void main(String[] args) {
//运行以下代码可以看出,两个线程,持有的threadlocal没有因为另一个改变了值而发生改变
// for(int i = 0;i<20;i++){
// Thread t1 = new MyThreadLocalDemo().new MyThread();
// Thread t2 = new MyThreadLocalDemo().new MyThread();
// t1.start();
// t2.start();
// }
Thread t1 = new MyThreadLocalDemo().new MyThread();
Thread t2 = new MyThreadLocalDemo().new MyThread();
t1.start();
t2.start();
}
}
这个程序的执行结果,有时候会get 出来 null,有时候不会。没想明白。ThreadLocal是为每个Thread对象都会一个独自的ThreadMap,不考虑性能的话,我觉得用map也是一样的效果。
但是实在不知道哪里出了问题,求大神指教。