20160529_线程范围内数据共享

来源:互联网 发布:淘宝羊皮女背包 编辑:程序博客网 时间:2024/05/23 15:24
</pre><pre name="code" class="java">//建立两个线程两个线程中的数据在本线程内共享,与其他线程之间独立package com.dahua.xiaozhe;import java.util.HashMap;import java.util.Map;import java.util.Random;public class ThreadScopShareData {    static Map<Thread , Integer >     mThreadDataMap = new HashMap<Thread,Integer>();            public static void main(String[] args) {        for (int i = 0 ; i < 2 ; i++){            new Thread(new Runnable() {                                @Override                public void run() {                    int  data = new Random().nextInt(100);                    mThreadDataMap.put(Thread.currentThread(), data);                    System.out.println(Thread.currentThread().getName() + "put data:"+data);                                        //取值                    new A().get();                    new B().get();                                    }            }).start();        }    }        static class A{        public void get(){            int data = mThreadDataMap.get(Thread.currentThread());            System.out.println(Thread.currentThread() +"use A get data:" +data);        }    }    static class B{        public void get(){            int data = mThreadDataMap.get(Thread.currentThread());            System.out.println(Thread.currentThread() +"use B get data:" +data);        }    }}

结果:


Thread-0put data:18Thread-1put data:36Thread[Thread-1,5,main]use A get data:36Thread[Thread-0,5,main]use A get data:18Thread[Thread-1,5,main]use B get data:36Thread[Thread-0,5,main]use B get data:18

2.用ThreadLocal加单例封装来实现


<span style="font-size:12px;">package com.dahua.xiaozhe;import java.util.HashMap;import java.util.Map;import java.util.Random;public class ThreadLocalScopShareData {static Map<Thread , Integer > mThreadDataMap = new HashMap<Thread,Integer>();public static void main(String[] args) {for (int i = 0 ; i < 2 ; i++){new Thread(new Runnable() {@Overridepublic void run() {int  data = new Random().nextInt(100);mThreadDataMap.put(Thread.currentThread(), data);//保存ThreadLocalSharedData.getThreadInstance().setName("name"+data);ThreadLocalSharedData.getThreadInstance().setAge(data);System.out.println(Thread.currentThread().getName() + "put data:"+ThreadLocalSharedData.getThreadInstance());//取值new A().get();new B().get();}}).start();}}static class A{public void get(){System.out.println(Thread.currentThread() +"use A get data:" +ThreadLocalSharedData.getThreadInstance());}}static class B{public void get(){System.out.println(Thread.currentThread() +"use B get data:" +ThreadLocalSharedData.getThreadInstance());}}}//对线程共享的数据进行封装class ThreadLocalSharedData{private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//构造函数私有化,单例模式private ThreadLocalSharedData(){}@Overridepublic String toString() {return "ThreadLocalSharedData [name=" + name + ", age=" + age + "]";}//保存线程数据static ThreadLocal<ThreadLocalSharedData> map= new ThreadLocal<ThreadLocalSharedData>();//单例模式static ThreadLocalSharedData getThreadInstance(){ThreadLocalSharedData instance = map.get();if(instance == null){instance = new ThreadLocalSharedData();map.set(instance);}return instance;}} </span>

结果:

Thread-0put data:ThreadLocalSharedData [name=name73, age=73]Thread-1put data:ThreadLocalSharedData [name=name60, age=60]Thread[Thread-1,5,main]use A get data:ThreadLocalSharedData [name=name60, age=60]Thread[Thread-0,5,main]use A get data:ThreadLocalSharedData [name=name73, age=73]Thread[Thread-1,5,main]use B get data:ThreadLocalSharedData [name=name60, age=60]Thread[Thread-0,5,main]use B get data:ThreadLocalSharedData [name=name73, age=73]






0 0