A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 王德升 中级黑马   /  2012-7-17 22:53  /  1498 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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());
               
        }
       
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马