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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王阳 中级黑马   /  2012-11-28 20:43  /  1125 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//定义一个存放Integer类型的ThreadLocal
        static ThreadLocal<Integer> map = new ThreadLocal<Integer>();
        public static void main(String[] args) {
                //启动两个线程并在run方法中得到一个随机数
        for (int i = 0; i < 2; i++) {
                        new Thread(new Runnable() {
                                @Override
                                public void run() {
                                        int data = new Random().nextInt();
                                        //打印出当前线程语句和随机数,然后将随机数保存至ThreadLocal
                                        System.out.println(Thread.currentThread().getName()+"is put data "+data);
                                        System.out.println(map.toString());
                                        map.set(data);
                                        //调用TestA和TestB的show方法
                                        new TestA().show();
                                        new TestB().show();
                                }
                        }).start();
                }
        }
        //定义两个内部类并获取各自线程的ThreadLocal保存的变量的值,然后打印输出语句
        static class TestA{
                public void show(){
                        int number = map.get();
                        System.out.println("TestA"+Thread.currentThread().getName()+" "+number);
                }
        }
        static class TestB{
                public void show(){
                        int number = map.get();
                        System.out.println("TestB"+Thread.currentThread().getName()+" "+number);
                }
        }
}
在run方法内,只有map.set(data)方法,但是ThreadLocal的源码的set方法,是通过一个this为key将值保存进去的,那如果才能确定那个this就是当前线程呢?

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
    每个线程中都有一个自己的ThreadLocalMap类对象,可以将线程自己的对象保持到其中,各管各的,线程可以正确的访问到自己的对象,将一个共用的ThreadLocal静态实例作为key,将不同对象的引用保存到不同线程的ThreadLocalMap中,然后在线程执行的各处通过这个静态ThreadLocal实例的get()方法取得自己线程保存的那个对象。
回复 使用道具 举报
婂埖糖 发表于 2012-11-28 20:53
每个线程中都有一个自己的ThreadLocalMap类对象,可以将线程自己的对象保持到其中,各管各的,线程可以 ...

我的意思就是,如果确定ThreadLocalMap里面保存的是当前线程引用呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马