ThreadLocal的練習代碼


?

場景:

有三個小孩兒,買了一個變形金剛玩具(Transformer)....

三個小孩都爭著玩這個玩具....沒有一個人可以玩...

第一種方式:每個人各玩一會....

第二種方式:再買兩個玩具,一個人玩一個.

每個小孩都當成一個線程.三個小孩就有三個線程.

?

Child.java

 2 
 3 import java.util.Random;
 4 import java.util.concurrent.TimeUnit;
 5 
 6 public class Child implements Runnable{
 7     private Transformer2 transformer;
 8     
 9     private String name ;
10 
11     
12     public Child(Transformer2 transformer) {
13         this.transformer = transformer;
14     }
15 
16     public Child() {
17     }
18 
19     public Transformer2 getTransformer() {
20         return transformer;
21     }
22 
23     public void setTransformer(Transformer2 transformer) {
24         this.transformer = transformer;
25     }
26 
27     public String getName() {
28         return name;
29     }
30 
31     public void setName(String name) {
32         this.name = name;
33     }
34     
35     
36     public void play(){
37         
38         
39         while (true) {
40             try {
41                 //transformer = new Transformer();//每次調用該方法,該對象都是新的。
42                 
43                 //想要的效果是每個小孩兒都有一個玩具,但是不管他玩多少次,這個玩具永遠都是唯一的.
44                 transformer = Transformer2.getInstance();
45                 System.out.println(Thread.currentThread().getName() +" :"+transformer );
46                 String str = "擎天柱" + new Random().nextInt(10);
47                 System.out.println(Thread.currentThread().getName()
48                         + ": 將變形金剛設置成 :" + str);
49                 transformer.setType(str);
50                 TimeUnit.SECONDS.sleep(2);
51 
52                 String type = transformer.getType();
53 
54                 System.out.println(Thread.currentThread().getName()
55                         + ": 獲取到的變形金剛是:" + type);
56 
57             } catch (InterruptedException e) {
58                 e.printStackTrace();
59             }
60         }
61         
62     }
63 
64     @Override
65     public void run() {
66         play();
67     }
68     
69 }

?

?

?Transformer.java

 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 
 7 /*
 8  * 每個線程都有且僅有一個 該類對象的引用。
 9  * 不應該在外部類中隨便的去new 所以構造方法私有
10  * 
11  */
12 public class Transformer {
13 
14     private static Map<Thread, Transformer> maps = new HashMap<Thread, Transformer>();
15     
16     private String type;
17     
18     private Transformer(){}
19     
20     public static Transformer getInstance() {
21         Transformer instance = maps.get(Thread.currentThread());
22         if(instance == null) {
23             instance = new Transformer();
24             maps.put(Thread.currentThread(),instance);
25         }
26         return instance;
27     }
28     public String getType() {
29         return type;
30     }
31 
32     public void setType(String type) {
33         this.type = type;
34     }
35     
36     
37 }

?

?

Transformer2.java(使用ThreadLocal類)

 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 
 7 /*
 8  * 每個線程都有且僅有一個 該類對象的引用。
 9  * 
10  */
11 public class Transformer2 {
12 
13     //private static Map<Thread, Transformer2> maps = new HashMap<Thread, Transformer2>();
14     private static ThreadLocal<Transformer2> maps = new ThreadLocal<Transformer2>();
15     
16     private String type;
17 
18     
19     private Transformer2(){}
20     
21     public static Transformer2 getInstance() {
22         Transformer2 instance = maps.get();
23         if(instance == null) {
24             instance = new Transformer2();
25             maps.set(instance);
26         }
27         return instance;
28     }
29     public String getType() {
30         return type;
31     }
32 
33     public void setType(String type) {
34         this.type = type;
35     }
36 }

?

?

測試類:

 2 
 3 public class Test {
 4 
 5     public static void main(String[] args) {
 6         
 7         //Transformer transformer = new Transformer();
 8         
 9         for (int i = 0; i < 3; i++) {
10             new Thread(new Child()).start();
11         }
12     }
13 }

?

轉載于:https://www.cnblogs.com/DreamDrive/p/6189267.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456691.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456691.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456691.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nginx+uwsgi部署Django

本篇文章主要介紹了解決nginxuwsgi部署Django的所有問題(小結)&#xff0c;小編覺得挺不錯的&#xff0c;現在分享給大家&#xff0c;也給大家做個參考。一起跟隨小編過來看看吧 最近&#xff0c;自己暑假寫的小項目也算完畢了&#xff0c;想著投放到自己云服務器上&#xff0…

$(document).scrollTop()與$(window).scrollTop()

$(document).scrollTop() 獲取垂直滾動的距離 即當前滾動的地方的窗口頂端到整個頁面頂端的距離 要獲取頂端 只需要獲取到scrollTop()0的時候 就是頂端了 要獲取底端 只要獲取$(document).scrollTop()>(document).height()?(window).height() 就可以知道已經…

各種機器學習開源項目精選TOP30

8800個機器學習開源項目為你精選TOP30&#xff01; 授權自AI科技大本營&#xff08;ID: rgznai100) 本文共圖文結合&#xff0c;建議閱讀5分鐘。 本文為大家帶來了30個廣受好評的機器學習開源項目。 最近&#xff0c;Mybridge發布了一篇文章&#xff0c;對比了過去一年中機…

Python中is與==的使用區別詳解

>>> a 1000 >>> b 1000 >>> print(id(a),id(b)) 2689566689904 2689566688880 >>> a ,b 1000,1000 >>> print(id(a),id(b)) 2689566689968 2689566689968 一行執行的用一個id地址 分行執行用兩個地址

解決:Please specify a different SDK name--PyCharm報錯

這個問題出現的原因是因為PyCharm中存在相同名字的虛擬環境變量。 本人的出錯原因是&#xff0c;一直使用PyCharm的默認設置來建立工程&#xff0c;所以每個工程都建立了自己獨立的虛擬環境。 我個人刪除了一些工程后&#xff0c;又建立相同名字的工程。所以才會出現存在相同…

Tomcat控制臺輸出到文件

為什么80%的碼農都做不了架構師&#xff1f;>>> 修改startup.bat call "%EXECUTABLE%" start %CMD_LINE_ARGS% 為 call "%EXECUTABLE%" run %CMD_LINE_ARGS% >> ..\logs\test.log 轉載于:https://my.oschina.net/cccyb/blog/886047

常見算法詳解(原理及代碼實現Python版本)

文章目錄前言1、冒泡排序2、選擇排序3、插入排序4、希爾排序5、快速排序6、歸并排序7、二分法查找總結前言 最近復習了下常見的算法&#xff0c;在這里手動再寫一遍&#xff0c;權當加深自己的印象。代碼實現用的是python3.6版本。 1、冒泡排序 原理&#xff1a; 冒泡排序&a…

解決:pycharm運行程序時在Python console窗口中運行 ?????????????1?????

解決&#xff1a;pycharm運行程序時在Python c 問題&#xff1a; 在pycharm中右鍵點擊run運行程序&#xff0c;發現沒有打開run窗口運行&#xff0c;而是在Python console窗口中運行的。 解決方法&#xff1a; 打開菜單欄 run->edit configurations&#xff0c; 把下圖中的…

Autowire異常

Autowire異常主要由三個情況發生的 1. 你的ServiceImpl必須以Service或Component注解才行。 2. 自動寫入的時候把接口寫成實現類了&#xff0c;例如 Autowired private BrandServiceImpl brandServiceImpl; 應該是 Autowired private BrandService brandService; 3. 在Dao 類上…

[轉載] 全方位提升網站打開速度:前端、后端、新的技術

原文地址&#xff1a;Building a Shop with Sub-Second Page Loads: Lessons Learned原文作者&#xff1a;Erik Witt譯文出自&#xff1a;掘金翻譯計劃譯者&#xff1a;luoyaqifei校對者&#xff1a;Romeo0906&#xff0c;L9m全方位提升網站打開速度&#xff1a;前端、后端、新…

20個頂級大數據軟件應用程序

目錄1. Domo2. Teradata Database3. Hitachi Vantara4. TIBCO公司的Statistica5. Panoply6. IBM Watson Analytics7. SAS Visual Analytics8. Sisense商業智能軟件9. Talend的大數據工作室10. Cloudera11. MongoDB12. Vertica Analytics Platform13. SAP Vora14. Oracle Big Da…

python完成‘21點游戲’

完成‘21點游戲’ 人機對戰&#xff1a; 輸入玩家姓名&#xff1a;玩家可以多次要牌&#xff0c;其中JQK&#xff0c;大小王是半點&#xff0c;其他是正常點數&#xff0c;玩家每要一次牌就打印下當前點數和系統點數。可以設置系統&#xff1a;只要大于等于21點就不要牌了&am…

materialrefeshlayout下拉刷新,上拉加載更多

1.添加依賴:compile com.cjj.materialrefeshlayout:library:1.3.0 2.布局中添加控件&#xff0c;包裹list控件<com.cjj.MaterialRefreshLayoutxmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto…

MapTask、ReduceTask并行度決定機制

目錄前言:1、mapTask并行度的決定機制2、ReduceTask并行度的決定總結&#xff1a; 目錄 前言: MapTask的并行度決定map階段的任務處理并發度&#xff0c;進而影響到整個job的處理速度。那么&#xff0c;MapTask并行實例是否越多越好呢&#xff1f;其并行度又是如何決定呢&am…

python# 完成“剪刀石頭布游戲”:

# 完成“剪刀石頭布游戲”&#xff1a; # 1. 進入剪刀石頭布游戲 # 2. 系統隨機出&#xff1a;可以是剪刀&#xff0c;可以是布&#xff0c;也可以是石頭&#xff08;可以使用隨機數完成1&#xff1a;剪刀&#xff0c;2&#xff1a;布&#xff0c;3&#xff1a;石頭&#x…

6大主流開源SQL引擎總結,遙遙領先的是誰?

根據 O’Reilly 2016年數據科學薪資調查顯示&#xff0c;SQL 是數據科學領域使用最廣泛的語言。大部分項目都需要一些SQL 操作&#xff0c;甚至有一些只需要SQL。本文就帶你來了解這些主流的開源SQL引擎&#xff01;背景介紹 本文涵蓋了6個開源領導者&#xff1a;Hive、Impala、…

Yarn在MapReduce中的工作機制

目錄前言:1、YARN概述2、mapreduce&yarn的工作機制總結&#xff1a; 目錄 前言: 在了解Yarn在MR中的作用的時候需要先了解Yarn是什么。 1、YARN概述 Yarn是一個資源調度平臺&#xff0c;負責為運算程序提供服務器運算資源&#xff0c;相當于一個分布式的操作系統平臺&…

python 擲骰子游戲

擲骰子游戲&#xff1a; 擲骰子游戲 可選擇的參加游戲的角色是&#xff1a;1.貂蟬 2.劉備 3.孫悟空 4.諸葛亮 5.曹操 輸入參加游戲的角色是: 1 貂蟬進入游戲…… 貂蟬請充值&#xff08;金額必須是100的倍數&#xff09;&#xff1a; ---》注意&#xff1a;充值3次不…

長連接心跳機制理解

近期使用go 開發聊天室&#xff0c;使用到websocket常鏈接。 if err websocket.JSON.Receive(ws,&reply); err ! nil {log.Println(err)return } 我發現當連接斷開的時候會走if里面&#xff0c;輸出eof 這樣就知道&#xff0c;客戶端斷開了連接。 但在之前使用workerman …

老男孩36期運維脫產班---- 決心書

我叫林宗超&#xff0c;來自四川&#xff0c;12年前畢業于四川的一所普通高中學校&#xff0c;畢業后再也沒有從事過其他的教育培訓學習。離開學校后我去過廣東&#xff0c;福建&#xff0c;最后因為我家駕校有了點小小的規模&#xff0c;缺人&#xff0c;我回到了成都做了幾年…