3.3.1ThreadLocal各线程变量的隔离

来源:互联网 发布:网络唤醒数据包 编辑:程序博客网 时间:2024/06/05 19:52

ThreadLocal:实现每一个线程的变量都可以存、取。

package demo;/** * Created by sunyifeng on 17/10/18. */public class Tools {    public static ThreadLocal threadLocal = new ThreadLocal();}
package demo;/** * Created by sunyifeng on 17/10/18. */public class ThreadA extends Thread {    @Override    public void run() {        super.run();        try {            for (int i = 0; i < 10; i++) {                Tools.threadLocal.set("ThreadA" + (i + 1));                System.out.println("ThreadA get value=" + Tools.threadLocal.get());                Thread.sleep(200);            }        } catch (InterruptedException e){            e.printStackTrace();        }    }}
package demo;/** * Created by sunyifeng on 17/10/18. */public class ThreadB extends Thread {    @Override    public void run() {        super.run();        try {            for (int i = 0; i < 10; i++) {                Tools.threadLocal.set("ThreadB" + (i + 1));                System.out.println("ThreadB get value=" + Tools.threadLocal.get());                Thread.sleep(200);            }        } catch (InterruptedException e){            e.printStackTrace();        }    }}
package demo;/** * Created by sunyifeng on 17/10/18. */public class Run {    public static void main(String[] args) {        try {            ThreadA threadA = new ThreadA();            ThreadB threadB = new ThreadB();            threadA.start();            threadB.start();            for (int i = 0; i < 10; i++) {                Tools.threadLocal.set("main" + (i + 1));                System.out.println("main get value=" + Tools.threadLocal.get());                Thread.sleep(200);            }        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
运行结果:

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

程序分析:

三个线程都向threadLocal中放变量,但是三个线程只能取出自己的数据。

再看一个栗子:

package demo;import java.util.Date;/** * Created by sunyifeng on 17/10/18. */public class Tools {    public static ThreadLocal<Date> threadLocal = new ThreadLocal<Date>();}
package demo;import java.util.Date;/** * Created by sunyifeng on 17/10/18. */public class ThreadA extends Thread {    @Override    public void run() {        super.run();        try {            for (int i = 0; i < 20; i++) {                if (Tools.threadLocal.get() == null) {                    Tools.threadLocal.set(new Date());                }                System.out.println("线程A放入的日期:" + Tools.threadLocal.get().getTime());                Thread.sleep(100);            }        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
package demo;import java.util.Date;/** * Created by sunyifeng on 17/10/18. */public class ThreadB extends Thread {    @Override    public void run() {        super.run();        try {            for (int i = 0; i < 20; i++) {                if (Tools.threadLocal.get() == null) {                    Tools.threadLocal.set(new Date());                }                System.out.println("线程B放入的日期:" + Tools.threadLocal.get().getTime());                Thread.sleep(100);            }        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
package demo;/** * Created by sunyifeng on 17/10/18. */public class Run {    public static void main(String[] args) {        try {            ThreadA threadA = new ThreadA();            threadA.start();            Thread.sleep(1000);            ThreadB threadB = new ThreadB();            threadB.start();        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
运行结果:

线程A放入的日期:1508259547270
线程A放入的日期:1508259547270
线程A放入的日期:1508259547270
线程A放入的日期:1508259547270
线程A放入的日期:1508259547270
线程A放入的日期:1508259547270
线程A放入的日期:1508259547270
线程A放入的日期:1508259547270
线程A放入的日期:1508259547270
线程A放入的日期:1508259547270
线程B放入的日期:1508259548272
线程A放入的日期:1508259547270
线程B放入的日期:1508259548272
线程A放入的日期:1508259547270
线程B放入的日期:1508259548272
线程A放入的日期:1508259547270
线程B放入的日期:1508259548272
线程A放入的日期:1508259547270
线程B放入的日期:1508259548272
线程A放入的日期:1508259547270
线程B放入的日期:1508259548272
线程A放入的日期:1508259547270
线程B放入的日期:1508259548272
线程A放入的日期:1508259547270
线程B放入的日期:1508259548272
线程A放入的日期:1508259547270
线程B放入的日期:1508259548272
线程A放入的日期:1508259547270
线程B放入的日期:1508259548272
线程A放入的日期:1508259547270
线程B放入的日期:1508259548272
线程B放入的日期:1508259548272
线程B放入的日期:1508259548272
线程B放入的日期:1508259548272
线程B放入的日期:1508259548272
线程B放入的日期:1508259548272
线程B放入的日期:1508259548272
线程B放入的日期:1508259548272
线程B放入的日期:1508259548272
线程B放入的日期:1508259548272

程序分析:

每个线程只能取自己的数据。

阅读全文
0 0