2019-09-20 13:17:37 4836瀏覽
今天千鋒扣丁學(xué)堂Java培訓(xùn)老師給大家ThreadLocal類應(yīng)用實(shí)戰(zhàn)案例分析的詳細(xì)介紹,結(jié)合具體案例形式分析了javaThreadLocal類的功能、原理、用法及相關(guān)操作注意事項(xiàng),下面我們一起來看一下吧。
class Account { /* 定義一個(gè)ThreadLocal類型的變量,該變量將是一個(gè)線程局部變量 每個(gè)線程都會(huì)保留該變量的一個(gè)副本 */ private ThreadLocal<String> name = new ThreadLocal<>(); // 定義一個(gè)初始化name成員變量的構(gòu)造器 public Account(String str) { this.name.set(str); // 下面代碼用于訪問當(dāng)前線程的name副本的值 System.out.println("---" + this.name.get()); } // name的setter和getter方法 public String getName() { return name.get(); } public void setName(String str) { this.name.set(str); } } class MyTest extends Thread { // 定義一個(gè)Account類型的成員變量 private Account account; public MyTest(Account account, String name) { super(name); this.account = account; } public void run() { // 循環(huán)10次 for (int i = 0 ; i < 10 ; i++) { // 當(dāng)i == 6時(shí)輸出將賬戶名替換成當(dāng)前線程名 if (i == 6) { account.setName(getName()); } // 輸出同一個(gè)賬戶的賬戶名和循環(huán)變量 System.out.println(account.getName() + " 賬戶的i值:" + i); } } } public class ThreadLocalTest { public static void main(String[] args) { // 啟動(dòng)兩條線程,兩條線程共享同一個(gè)Account, // 主線程中有一個(gè)Account的name,線程甲和線程乙中也各有一個(gè)Account的name,三者互不干擾 Account at = new Account("初始名"); /* 雖然兩條線程共享同一個(gè)賬戶,即只有一個(gè)賬戶名 但由于賬戶名是ThreadLocal類型的,所以每條線程 都完全擁有各自的賬戶名副本,所以從i == 6之后,將看到兩條 線程訪問同一個(gè)賬戶時(shí)看到不同的賬戶名。 */ new MyTest(at , "線程甲").start(); new MyTest(at , "線程乙").start (); } }
---初始名 null 賬戶的i值:0 null 賬戶的i值:0 null 賬戶的i值:1 null 賬戶的i值:1 null 賬戶的i值:2 null 賬戶的i值:2 null 賬戶的i值:3 null 賬戶的i值:3 null 賬戶的i值:4 null 賬戶的i值:4 null 賬戶的i值:5 線程甲 賬戶的i值:6 線程甲 賬戶的i值:7 線程甲 賬戶的i值:8 線程甲 賬戶的i值:9 null 賬戶的i值:5 線程乙 賬戶的i值:6 線程乙 賬戶的i值:7 線程乙 賬戶的i值:8 線程乙 賬戶的i值:9
【關(guān)注微信公眾號(hào)獲取更多學(xué)習(xí)資料】 【掃碼進(jìn)入JavaEE/微服務(wù)VIP免費(fèi)公開課】