开发者学堂课程【Java 高级编程:ThreadLocal 类】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/20/detail/357
ThreadLocal 类
内容介绍:
1.范例:定义一个消息发送的结构
2. 范例:使用多线程发送消息
3. 在 ThreadLocal 类中的操作方法
在了解 ThreadLocal 类作用时,先编写一个简单的程序做一个先期的分析。
范例:定义一个消息发送的结构
package cn
.
mldn
.
demo
;
class
Channel
{
//消息.的发送通道
private
static
Message message
;
public
static
void
setMessage
(
Message m
)
{
message
=
m
;
}
public
static
void
send
()
{
//发送消息.
system
.
out
.
println
(
"【消息发送】"
+
message
.
getInfo
());
}
}
class
Message
{
//要发送的消息体
private
String
info
;
public
void
setInfo
(
String
info
)
{
this
.
info
=
info
;
}
}
public
String
getInfo
(
)
{
return
info
;
}
}
public
class
JavaAPIDemo
{
public
static
void
main
(
String
[
]
args
)
throws
Exception
{
}
}
总结:对于当前的程序实际上采用的是一种单线程的模式来进行处理的。
那么如果在多线程的状态下,能否实现完全一致的操作效果。为此将启动三个线程进行处理.
范例:使用多线程发送消息
package cn.mldn .demo;
public class JavaAPTDemo {
public static void main(String[] args) throws Exception {
new Thread(()->{
Message msg = new Message() ;
//实例化消息主体对象
msg.setInfo("第一个线程的消息");
//设置要发送的内容
Channe1.setMessage(msg);
//设置要发送的消息
Channe1.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 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());
}
}
class Message { //要发送的消息体
private String info ;
public void setInfo( String info) {
this.info = info;
}
}
public String getInfo( ) {
return info;
}
}
public class JavaAPIDemo {
public static void main(String[ ] args) throws Exception {
}
}
运行结果:
【消息发送者 A、消息发送】第二个线程的消息
【消息.发送者 C、消息.发送】第三个线程的消息
【消息发送者 B、消息发送】第二个线程的消息
这时消息的处理产生了影响
总结:在保持 Channel( 所有发送的通道)核心结构不改变的情况下,需要考虑到每个线程的独立操作问题。
那么在这样的情况下,我们发现对于 Channel 类而言除了要保留有发送的消息之外,还应该多存放有一个每线程的标记(当前线程)。
这时我们就可以通过 ThreadLocal 类来存放数据。
在 ThreadLocal 类中,通过有如下的操作方法:
• 构造方法: public ThreadLocal();
• 设置数据: public void set(T value);
• 取出数据:public T get();
• 删除数据:public void remove();