ThreadLocal类
Posted tony98
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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会作为初期项目的实现基础!
以上是关于ThreadLocal类的主要内容,如果未能解决你的问题,请参考以下文章
ThreadLocal精进篇:子线程类InheritableThreadLocal