zoukankan      html  css  js  c++  java
  • ThreadLocal类

      以后的项目里面,ThreadLocal可以帮助我们减少一些重要的引用传递。

     1 package cn.Tony.demo;
     2 
     3 class Message{
     4     private String note;
     5     public String getNote() {
     6         return note;
     7     }
     8     public void setNote(String note) {
     9         this.note = note;
    10     }
    11 } 
    12 class MessageConsumer{
    13     public void print(Message msg) {//必须明确接受Message对象
    14         System.out.println(Thread.currentThread().getName()+"="+msg.getNote());
    15     }
    16 }
    17 public class TestDemo{
    18     public static void main(String[] args) throws Exception {
    19         new Thread(() ->{
    20             Message msg=new Message();
    21             msg.setNote("www.Tony.com");
    22             new MessageConsumer().print(msg);
    23         },"用户A").start();
    24         new Thread(() ->{
    25             Message msg=new Message();
    26             msg.setNote("明天过后");
    27             new MessageConsumer().print(msg);
    28         },"用户B").start();
    29     }
    30 } 

      以上的代码之中明确的用了引用传递将Message类的对象传递给了MessageConsumer课的print()方法

      所以如果现在想要明确标出每一个线程的具体的对象信息,就需要使用ThreadLocal,实际上整个保存数据的时候多保存了一个currentThread

      public class ThreadLocal<T> extends Object

      而后在这个类里面有一下几个重要方法

        取得数据:public T get();

         保存数据:public void set(T value)  

         删除数据:public void remove()

    范例:使用ThreadLocal解决当前问题

     1 package cn.Tony.demo;
     2 
     3 class Message{
     4     private String note;
     5     public String getNote() {
     6         return note;
     7     }
     8     public void setNote(String note) {
     9         this.note = note;
    10     } 
    11 }   
    12 class MessageConsumer{
    13     public void print() {//必须明确接受Message对象
    14         System.out.println(Thread.currentThread().getName()+"="+MyUtil.get().getNote());
    15     }
    16 }
    17 class MyUtil{
    18     private static ThreadLocal<Message> threadLocal=new ThreadLocal<Message>();
    19     public static void set(Message msg) {
    20         threadLocal.set(msg);
    21     }
    22     public static Message get() {
    23         return threadLocal.get();
    24     }
    25 }
    26 public class TestDemo{
    27     public static void main(String[] args) throws Exception {
    28         new Thread(() ->{
    29             Message msg=new Message();
    30             msg.setNote("www.Tony.com");
    31             MyUtil.set(msg);
    32             new MessageConsumer().print();
    33         },"用户A").start();
    34         new Thread(() ->{
    35             Message msg=new Message();
    36             msg.setNote("明天过后");
    37             MyUtil.set(msg);
    38             new MessageConsumer().print();
    39         },"用户B").start();
    40     }
    41 } 

      一个项目中最重要的对象就是资源的连接信息,例如:数据库

      以后的开发ThreadLocal会作为初期项目的实现基础!

  • 相关阅读:
    网络虚拟化中的 offload 技术:LSO/LRO、GSO/GRO、TSO/UFO、RSS、VXLAN
    pve5下的iptables案例分析-无法访问input相关端口
    linux mail相关-涉及windows下nslookup使用
    qemu的vnc选项-参考至qemu wiki
    windows任务管理器-线程优先级
    在proxmox中模拟树莓派
    unzip命令的使用
    fdisk分区遇到的问题-涉及lv逻辑卷扩容
    fail2ban(1)
    Different Integers 牛客网暑期ACM多校训练营(第一场) J 离线+线状数组或者主席树
  • 原文地址:https://www.cnblogs.com/Tony98/p/10516119.html
Copyright © 2011-2022 走看看