如何不传入对象就获得某对象的方法---ThreadLocal类
其实这篇博客的内容有两个
一、如何不给一个函数传入另一个对象(称为对象:甲),就在函数体内调用甲的一些属性和方法!
二、ThreadLocal类的使用方法
为了能把这两点都体现出来才把标题写成了这样!
第一个问题:先看代码:
1 class Message{ 2 private String note; 3 4 public String getNote() { 5 return note; 6 } 7 8 public void setNote(String note) { 9 this.note = note; 10 } 11 } 12 class MessageConsumer{ 13 public void print(Message msg){ 14 System.out.println(Thread.currentThread().getName()+" = "+msg.getNote()); 15 } 16 } 17 18 public class TestDemo { 19 20 public static void main(String[] args) throws Exception{ 21 new Thread(()->{ 22 Message msg = new Message(); 23 msg.setNote("www.baidu.com"); 24 new MessageConsumer().print(msg); 25 26 },"线程1").start(); 27 new Thread(()->{ 28 Message msg = new Message(); 29 msg.setNote("wode di er ge xian cheng "); 30 new MessageConsumer().print(msg); 31 32 },"线程2").start(); 33 } 34 }
可以看到13行的函数传入了对象Message。
那么如何不给这个函数传入方法(print()方法没有任何参数),就让它能打印出msg的信息呢??
希望自己想一下再往下看,因为自己动脑子想效果会更好。
结果如下:
1 class Message{ 2 private String note; 3 4 public String getNote() { 5 return note; 6 } 7 8 public void setNote(String note) { 9 this.note = note; 10 } 11 } 12 class MessageConsumer{ 13 public void print(){ 14 System.out.println(Thread.currentThread().getName()+" = "+MyUtil.getThreadLocal().getNote()); 15 } 16 } 17 class MyUtil{ 18 private static ThreadLocal<Message> threadLocal = new ThreadLocal<>(); 19 public static void setThreadLocal(Message message){ 20 threadLocal.set(message); 21 } 22 public static Message getThreadLocal(){ 23 return threadLocal.get(); 24 } 25 } 26 public class TestDemo { 27 28 public static void main(String[] args) throws Exception{ 29 new Thread(()->{ 30 Message msg = new Message(); 31 msg.setNote("www.baidu.com"); 32 MyUtil.setThreadLocal(msg); 33 new MessageConsumer().print(); 34 35 },"线程1").start(); 36 new Thread(()->{ 37 Message msg = new Message(); 38 msg.setNote("wode di er ge xian cheng "); 39 MyUtil.setThreadLocal(msg); 40 new MessageConsumer().print(); 41 42 },"线程2").start(); 43 } 44 }
这里的方法很巧妙,通过一个工具类来接受Message类。也就是借用MyUtil工具类来传参。而不是直接传参。
这里用到了ThreadLocal类。我们来引出了第二个问题:
ThreadLocal类的对象可以只保存当前对象的数据,这样很方便的保证的线程的安全。我们每个线程只会用到自己线程里的数据不会用到其他线程的数据。
大家可以看到我们没用到ThreadLocal类的效果会怎么样?
我们的MyUtil类里面定义的不是ThreadLocal类,而是直接顶一个Message会怎么样呢??
大家可以自己试一下。
结果肯定是两个线程输出的东西一样,而不是像使用了ThreadLocal类,可以保证两个线程谁使用谁自己的数据。