開發者學堂課程【Java 進階程式設計:ThreadLocal 類】學習筆記,與課程緊密聯系,讓使用者快速學習知識。
課程位址:
https://developer.aliyun.com/learning/course/20/detail/357ThreadLocal 類
内容介紹:
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();