码迷,mamicode.com
首页 > 编程语言 > 详细

《java多线程编程核心技术》----ThreadLocal

时间:2019-08-08 00:20:20      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:void   inter   ext   多线程编程   ati   color   code   art   set   

public class Run {
    // 类ThreadLocal解决的是变量在不同线程间的隔离性,也就是 不同的线程拥有自己的值,
    // 不同线程中的值是可以放入ThreadLocal中进行保存的。
    public static ThreadLocal t1= new ThreadLocal();

    public static void main(String[] args) {
        if(t1.get()==null){
            System.out.println("从未放过值");
            t1.set("我的值");
        }

        System.out.println(t1.get());
        System.out.println(t1.get());
        //从未放过值
        //我的值
        //我的值   
    }
}
// 这里证明对应同一个threadlocal对象,不同的线程使用,线程之间是隔离的
// 线程a和线程b,同时修改threadlocal,不相互影响
public class Run {
    // 验证线程变量的隔离性
    public static ThreadLocal t1 = new ThreadLocal();

    public static void main(String[] args) {
        ThreadA a = new ThreadA();
        ThreadB b = new ThreadB();
        a.start();
        b.start();
        try {
            for (int i = 0; i < 10; i++) {
                t1.set("main" + (i + 1));
                System.out.println("main get value = " + t1.get());
                Thread.sleep(200);
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    static class ThreadA extends Thread {
        @Override
        public void run() {
            try {
                for (int i = 0; i < 10; i++) {
                    t1.set("ThreadA" + (i + 1));
                    System.out.println("ThreadA get value = " + t1.get());
                    Thread.sleep(200);
                }

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

    static class ThreadB extends Thread {
        @Override
        public void run() {
            try {
                for (int i = 0; i < 10; i++) {
                    t1.set("ThreadB" + (i + 1));
                    System.out.println("ThreadB get value = " + t1.get());
                    Thread.sleep(200);
                }

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

}
main get value = main1
ThreadA get value = ThreadA1
ThreadB get value = ThreadB1
ThreadB get value = ThreadB2
ThreadA get value = ThreadA2
main get value = main2
main get value = main3
ThreadB get value = ThreadB3
ThreadA get value = ThreadA3
ThreadA get value = ThreadA4
ThreadB get value = ThreadB4
main get value = main4
ThreadA get value = ThreadA5
ThreadB get value = ThreadB5
main get value = main5
main get value = main6
ThreadB get value = ThreadB6
ThreadA get value = ThreadA6
main get value = main7
ThreadB get value = ThreadB7
ThreadA get value = ThreadA7
ThreadA get value = ThreadA8
ThreadB get value = ThreadB8
main get value = main8
ThreadA get value = ThreadA9
ThreadB get value = ThreadB9
main get value = main9
main get value = main10
ThreadA get value = ThreadA10
ThreadB get value = ThreadB10

 

// 这里说明,每个线程保存每个线程的单独的变量,且如果线程内部可以改变的threadlocal的值
// 我们可以在其中添加我们需要的类型,这里是string类型,a线程内部,每次都改变了threadlocal的值
public class Run {
// 验证线程变量的隔离性
    public static ThreadLocal t1 = new ThreadLocal();

    public static void main(String[] args) {
        ThreadA a = new ThreadA();
        ThreadB b = new ThreadB();
        a.start();
        b.start();
    }

    static class ThreadA extends Thread {
        @Override
        public void run() {
            try {
                for (int i = 0; i < 5; i++) {
                    t1.set("ThreadA" + (i + 1));
                    System.out.println("ThreadA 1 get value = " + t1.get());
                    System.out.println("ThreadA 2 get value = " + t1.get());
                    Thread.sleep(200);
                }

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

    static class ThreadB extends Thread {
        @Override
        public void run() {
            try {
                for (int i = 0; i < 5; i++) {
                    t1.set("ThreadB" + (i + 1));
                    System.out.println("ThreadB get value = " + t1.get());
                    Thread.sleep(200);
                }

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

}
ThreadA 1 get value = ThreadA1
ThreadA 2 get value = ThreadA1
ThreadB get value = ThreadB1
ThreadB get value = ThreadB2
ThreadA 1 get value = ThreadA2
ThreadA 2 get value = ThreadA2
ThreadB get value = ThreadB3
ThreadA 1 get value = ThreadA3
ThreadA 2 get value = ThreadA3
ThreadA 1 get value = ThreadA4
ThreadB get value = ThreadB4
ThreadA 2 get value = ThreadA4
ThreadA 1 get value = ThreadA5
ThreadB get value = ThreadB5
ThreadA 2 get value = ThreadA5

 

《java多线程编程核心技术》----ThreadLocal

标签:void   inter   ext   多线程编程   ati   color   code   art   set   

原文地址:https://www.cnblogs.com/windy13/p/11318639.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!