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
程序分析:
每个线程只能取自己的数据。
- 3.3.1ThreadLocal各线程变量的隔离
- 线程变量隔离化ThreadLocal(2)
- ThreadLocal 线程间的数据隔离
- 多线程 : ThreadLocal 实现线程间共享变量隔离例子
- ThreadLocal实现线程隔离
- ThreadLocal线程隔离
- 线程局部变量ThreadLocal的认识
- ThreadLocal 线程范围内的共享变量
- ThreadLocal实现线程范围的共享变量
- ThreadLocal实现线程范围的共享变量
- ThreadLocal实现线程范围的共享变量
- ThreadLocal实现线程范围的共享变量
- ThreadLocal实现线程范围的共享变量
- ThreadLocal线程范围内的共享变量
- ThreadLocal 线程范围的共享变量
- ThreadLocal实现线程范围的共享变量
- ThreadLocal本地线程变量的理解
- ThreadLocal本地线程变量的理解
- 战场,紫书P175UVa11853
- 从键盘输入20个数a1到a20,计算并输出b1到b10,b1=根号(a1*a1+a20*a20),...,b10=根号(a10*a10+a11*a11)
- Lintcode 680. split string(分割字符串)(更改后)
- 项目中自动读取properties文件
- C++虚函数机制解析
- 3.3.1ThreadLocal各线程变量的隔离
- 软件测试十本书
- 微信小程序开发之天气预报
- linux克隆虚拟机出现问题bringing up interface eth0:device eth0
- python中模拟switch
- hdu5730 Shell Necklace
- python extends
- loj #6001. 「网络流 24 题」太空飞行计划(最大权闭合子图)
- Oracle中内连接查询(inner join),自然连接查询(natural join),自连接查询,外连接查询(outer join),左外连接(left join),右外连接(right joi