天天看點

ThreadLocal 類|學習筆記

開發者學堂課程【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

{

}

}

ThreadLocal 類|學習筆記

總結:對于目前的程式實際上采用的是一種單線程的模式來進行處理的。

那麼如果在多線程的狀态下,能否實作完全一緻的操作效果。為此将啟動三個線程進行處理.

範例:使用多線程發送消息

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、消息發送】第二個線程的消息

這時消息的處理産生了影響

ThreadLocal 類|學習筆記

總結:在保持 Channel( 所有發送的通道)核心結構不改變的情況下,需要考慮到每個線程的獨立操作問題。

那麼在這樣的情況下,我們發現對于 Channel 類而言除了要保留有發送的消息之外,還應該多存放有一個每線程的标記(目前線程)。

這時我們就可以通過 ThreadLocal 類來存放資料。

在 ThreadLocal 類中,通過有如下的操作方法:

ThreadLocal 類|學習筆記

• 構造方法: ​​

public ThreadLocal();

• 設定資料:​

public void set(T value);

• 取出資料​

:public T get();

• 删除資料:​

public void remove();