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

  • 相关阅读:
    关于C++类中的静态数据成员
    关于C++中char,sizeof,strlen,string
    C++学习笔记(7)
    C++学习笔记(6)
    C++学习笔记(指针)
    C++学习笔记(4)
    UVA 10780
    UVA 531
    HDU, 3579 Hello Kiki
    UVA, 10413 Crazy Savages
  • 原文地址:https://www.cnblogs.com/ilovessf/p/7462073.html
Copyright © 2011-2022 走看看