a
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadLocalTest {
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(2);
Runnable runnable = new Runnable(){
A a = new A();
public void run() {
MyData.getMyDate().setY(new Random().nextInt(10000));//匿名内部内?这里是怎么调用的?
a.say();
}
};
service.execute(runnable);
service.execute(runnable);
service.shutdown();
}
}
class MyData{
public static ThreadLocal x = new ThreadLocal();
public static void set(Object value){
x.set(value);
}
public static Object get(){
return x.get();
}
private static ThreadLocal data = new ThreadLocal();//为什么同一个线程,不管getMyData多少次和在哪里getMyData,拿到的都是同一个
public static MyData getMyDate(){ //为什么不同线程是不同的呢?
MyData myData = (MyData)data.get();
if(myData == null){
myData = new MyData();
data.set(myData);
}
return myData;
}
private MyData(){}//怎么搞个空参数构造函数在这?
private Integer y;
public void setY(Integer y){
this.y = y;
}
public Integer getY(){
return y;
}
}
class A{
public void say(){
System.out.println("say " + Thread.currentThread().getName() + " geted " + MyData.getMyDate().getY());
new B().sayHello();
}
}
class B{
public void sayHello() {
System.out.println("sayHello " + Thread.currentThread().getName() + " geted " + MyData.getMyDate().getY());
}
}
|
|