如何不传入对象就获得某对象的方法---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类,可以保证两个线程谁使用谁自己的数据。

 

posted @ 2017-09-01 10:44  money云  阅读(153)  评论(0编辑  收藏  举报