欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java: ThreadLocal类

程序员文章站 2024-01-18 20:15:52
...


一个项目中最重要的就是资源的连接信息, 例如数据库
使用ThreadLocal类 可以明确标记出每一个线程的具体的对象信息, 实际上是在数据保存的时候多保存了一个currentThread, 不过此类有局限

本类定义:

public class ThreadLocal<T> extends Object

重要方法

取得数据: (取一个)

public T get();

保存数据: (存一个)

public void set(T value);

删除数据

public void remove();

范例

package com.cwq.beyond;

class Message{
	private String note;
	public void setNote(String note) {
		this.note = note;
	}
	public String getNote() {
		return note;
	}
	
}

class MessageConsumer{
	public void print() {
		System.out.println(Thread.currentThread().getName()+" = "+MyUtil.message.getNote());
	}
}

class MyUtil{
	public static Message message;
}

public class TestDemoTwo {
	public static void main(String[] args) throws Exception{
		new Thread(()->{
			Message message = new Message();
			message.setNote("I am a student!");
			MyUtil.message = message;
			new MessageConsumer().print();
		},"用户A") .start();
		
		new Thread(()->{
			Message message = new Message();
			message.setNote("I am a teacher!");
			MyUtil.message = message;
			new MessageConsumer().print();
		},"用户B") .start();
	}

}

出现问题 (线程没有同步)

Java: ThreadLocal类

使用 ThreadLocal 类进行实现

package com.cwq.beyond;

class Message{
	private String note;
	public void setNote(String note) {
		this.note = note;
	}
	public String getNote() {
		return note;
	}
	
}

class MessageConsumer{
	public void print() {
		System.out.println(Thread.currentThread().getName()+" = "+MyUtil.get().getNote());
	}
}

class MyUtil{
	private static ThreadLocal<Message> threadLocal = new ThreadLocal<Message>();
	public static Message get() {
		return threadLocal.get();
	}
	public static void set(Message msg) {
		threadLocal.set(msg);
	}
}

public class TestDemoTwo {
	public static void main(String[] args) throws Exception{
		new Thread(()->{
			Message message = new Message();
			message.setNote("I am a student!");
			MyUtil.set(message);
			new MessageConsumer().print();
		},"用户A") .start();
		
		new Thread(()->{
			Message message = new Message();
			message.setNote("I am a teacher!");
			MyUtil.set(message);
			new MessageConsumer().print();
		},"用户B") .start();
	}

}

Java: ThreadLocal类