(Biblioteca de clases de soporte de desarrollo) ThreadLocal Class

ThreadLocal 类

Para comprender el papel de los objetos de la clase ThreadLocal, primero escriba un programa simple para observar:

package 开发支持类库;

public class ThreadLocal类 {
	public static void main(String[] args) {
		Message msg = new Message();//实例化消息主体对象
		msg.setInfo("这是一个消息内容");//设置发送的消息内容
		Channel.setMessage(msg);//设置发送的消息
		Channel.send();//发送
	}
}

//发送的消息体
class Message{
	private String info;
	
	public void setInfo(String info) {
		this.info = info;
	}
	
	public String getInfo() {
		return info;
	}
}

//消息的发送通道
class Channel{
	private static Message message;
	
	public static void setMessage(Message m) {
		message = m;
	}
	
	//发送消息
	public static void send() {
		System.out.println("【消息发送】"+message.getInfo());
	}
}

[Envío de mensaje] Este es el contenido de un mensaje

El programa actual se procesa realmente en un modo de un solo subproceso. Entonces, ¿si en el estado de multiproceso se pueden lograr efectos de operación consistentes? Con este fin, se iniciarán tres subprocesos para su procesamiento.

Ejemplo: el impacto del subproceso múltiple

package 开发支持类库;

public class ThreadLocal类 {
	public static void main(String[] args) {
		//创建三个线程,利用Lambda表示式直接覆写run()方法
		new Thread(()->{
			Message msg = new Message();//实例化消息主体对象
			msg.setInfo("第一个线程的消息内容");//设置发送的消息内容
			Channel.setMessage(msg);//设置发送的消息
			Channel.send();//发送
		},"消息发送者A").start();
		
		new Thread(()->{
			Message msg = new Message();//实例化消息主体对象
			msg.setInfo("第二个线程消息内容");//设置发送的消息内容
			Channel.setMessage(msg);//设置发送的消息
			Channel.send();//发送
		},"消息发送者B").start();
		 
		new Thread(()->{
			Message msg = new Message();//实例化消息主体对象
			msg.setInfo("第三个线程的消息内容");//设置发送的消息内容
			Channel.setMessage(msg);//设置发送的消息
			Channel.send();//发送
		},"消息发送者C").start();
	}
}

//发送的消息体
class Message{
	private String info;
	
	public void setInfo(String info) {
		this.info = info;
	}
	
	public String getInfo() {
		return info;
	}
}

//消息的发送通道
class Channel{
	private static Message message;
	
	public static void setMessage(Message m) {
		message = m;
	}
	
	//发送消息
	public static void send() {
		System.out.println(Thread.currentThread().getName()+"【消息发送】"+message.getInfo());
	}
}

(El resultado no es fijo)

Remitente del mensaje A [envío del mensaje] contenido del mensaje del segundo hilo
Remitente del mensaje B [envío del mensaje] contenido del mensaje del segundo hilo
Remitente del mensaje C [envío del mensaje] contenido del mensaje del tercer hilo

En este momento, el procesamiento del mensaje tiene un impacto. La razón principal es que los tres hilos tienen que configurar la información del Mensaje, y el primer hilo acaba de configurarlo y no lo ha enviado, y el segundo hilo ha modificado eso.

Mientras se mantiene la estructura central del Canal (todos los canales enviados) sin cambios, es necesario considerar el funcionamiento independiente de cada hilo. En este caso, se encuentra que además de retener los mensajes enviados, el Canal también debe Almacenar la marca de cada hilo (hilo actual), entonces en este momento puede almacenar datos a través de la clase ThreadLocal. Los siguientes métodos se proporcionan en la clase ThreanLocal:

  • Método de construcción: public ThreadLocal ();
  • Establecer datos: public void set ();
  •  Saque los datos: public T get ();
  • Eliminar datos: public void remove ();

Utilice la clase ThreadLocal para almacenar objetos, puede almacenar el objeto de hilo actual y el objeto de datos al mismo tiempo, para asegurarse de que el objeto de hilo actual corresponda al objeto de datos actual.

 

Ejemplo: resolver el problema de la sincronización de subprocesos

package 开发支持类库;

public class ThreadLocal类 {
	public static void main(String[] args) {
		//创建三个线程,利用Lambda表示式直接覆写run()方法
		new Thread(()->{
			Message msg = new Message();//实例化消息主体对象
			msg.setInfo("第一个线程的消息内容");//设置发送的消息内容
			Channel.setMessage(msg);//设置发送的消息
			Channel.send();//发送
		},"消息发送者A").start();
		
		new Thread(()->{
			Message msg = new Message();//实例化消息主体对象
			msg.setInfo("第二个线程消息内容");//设置发送的消息内容
			Channel.setMessage(msg);//设置发送的消息
			Channel.send();//发送
		},"消息发送者B").start();
		 
		new Thread(()->{
			Message msg = new Message();//实例化消息主体对象
			msg.setInfo("第三个线程的消息内容");//设置发送的消息内容
			Channel.setMessage(msg);//设置发送的消息
			Channel.send();//发送
		},"消息发送者C").start();
	}
}

//发送的消息体
class Message{
	private String info;
	
	public void setInfo(String info) {
		this.info = info;
	}
	
	public String getInfo() {
		return info;
	}
}

//消息的发送通道
class Channel{
	private static ThreadLocal<Message> THREADLOCAL = new ThreadLocal<Message>();//创建一个用来存储Message类型数据的ThreadLocal对象
	
	public static void setMessage(Message m) {
		THREADLOCAL.set(m);//向ThreadLocal保存数据,会把当前线程对象也存储起来。
	}
	
	//发送消息
	public static void send() {
		System.out.println(Thread.currentThread().getName()+"【消息发送】"+THREADLOCAL.get().getInfo());//根据线程的当前对象取出Message对象执行getInfo()
	}
}

Remitente del mensaje C [envío del mensaje] contenido del mensaje del tercer hilo
Remitente del mensaje B [envío del mensaje] contenido del mensaje del segundo hilo
Remitente del mensaje A [envío del mensaje] contenido del mensaje del primer hilo

Cada hilo solo puede guardar una pieza de datos a través de ThreadLocal, que puede entenderse como: clave (hilo actual) corresponde a un valor (objeto de datos).

Supongo que te gusta

Origin blog.csdn.net/weixin_46245201/article/details/112598870
Recomendado
Clasificación