java 多线程-ThreadLocal
发布时间:2020-12-15 08:00:35 所属栏目:Java 来源:网络整理
导读:ThreadLocal:每个线程自身的存储本地、局部区域,类似于容器,每个线程都会在其中有一定存储空间 常用的方法get/set/initialValue 官方建议为private static 每个线程存储自己的数据,更改不会影响其他线程 ThreadLocal 子类InheritableThreadLocal: 继承上
ThreadLocal:每个线程自身的存储本地、局部区域,类似于容器,每个线程都会在其中有一定存储空间
常用的方法get/set/initialValue 官方建议为private static 每个线程存储自己的数据,更改不会影响其他线程 ThreadLocal 子类InheritableThreadLocal: 继承上下文环境的数据 public class my { //Integer 初始值为null //private static ThreadLocal<Integer> threadlocal=new ThreadLocal<>(); //更改初始值需要创建ThreadLocal的子类重写initialValue或者使用lambda(jdk8) private static ThreadLocal<Integer> threadlocal=new ThreadLocal <Integer>() {//父类匿名内部类重写方法 protected Integer initialValue() { return 200; } }; //private static ThreadLocal<Integer> threadlocal=new ThreadLocal.withInitial(()->200); public static void main(String[]args) throws InterruptedException { //获取值 System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get()); //设置值 threadlocal.set(99); System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get()); new Thread(new test()).start(); new Thread(new test()).start(); } public static class test implements Runnable { public void run() { threadlocal.set((int)(Math.random()*100)); System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get()); } } } 每个线程自身的数据更改不会影响其他线程 public class my { private static ThreadLocal<Integer> threadlocal=new ThreadLocal <Integer>() {//父类匿名内部类重写方法 protected Integer initialValue() { return 1; } }; public static void main(String[]args) throws InterruptedException { for(int i=0;i<5;i++) { new Thread(new test()).start(); } } public static class test implements Runnable { public void run() { //修改不会影响其他线程 Integer left=threadlocal.get(); System.out.println(Thread.currentThread().getName()+"-->"+left); threadlocal.set(left-1); System.out.println(Thread.currentThread().getName()+"还剩下"+threadlocal.get()); } } } 分析ThreadLocal运行环境: public class my { private static ThreadLocal<Integer> threadlocal=new ThreadLocal <Integer>() {//父类匿名内部类重写方法 protected Integer initialValue() { return 1; } }; public static void main(String[]args) throws InterruptedException { new Thread(new test()).start();//两个打印的内容在不同的线程里 //当start()之后,线程才从main转换到其他线程,所以构造器里的是main线程的 } public static class test implements Runnable { public test() { threadlocal.set(100); //属于main线程,修改不会影响start内的线程 System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get()); } public void run() { System.out.println(Thread.currentThread().getName()+"还剩下"+threadlocal.get()); } } } 子类InheritableThreadLocal: public class my { private static ThreadLocal<Integer> threadlocal=new InheritableThreadLocal<>(); public static void main(String[]args) throws InterruptedException { System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get()); threadlocal.set(2); //此线程由main线程开辟,拷贝一份main线程的数据给此线程 //即将main线程里的2给此线程 new Thread(()->{ System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get()); threadlocal.set(200); System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get()); }).start(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 抑制Java Findbugs错误(EI_EXPOSE_REP)
- java – 从批处理文件的进程中读取InputStream会跳到下一行
- java – Spring @RequestMapping
- 如何通过Java运行我的haskell函数
- java – BASE64Encoder是内部API,可能会在将来的版本中删除
- 多线程 – 用于多线程同步的OO设计模式
- java – 它不会抛出异常ConcurrentModificationException
- 基于javaWeb 项目SSM配置要点及可能遇到的问题和解决方法
- java – 将图像从Android设备发送到服务器进行处理并将结果
- 什么是HashMap?什么情况下使用HashMap?