zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    RE
    【LeetCode】198. House Robber
    【LeetCode】053. Maximum Subarray
    【LeetCode】152. Maximum Product Subarray
    【LeetCode】238.Product of Array Except Self
    【LeetCode】042 Trapping Rain Water
    【LeetCode】011 Container With Most Water
    【LeetCode】004. Median of Two Sorted Arrays
    【LeetCode】454 4Sum II
    【LeetCode】259 3Sum Smaller
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/6189267.html
Copyright © 2011-2022 走看看