您的位置:首页 > 其它

20160529_线程范围内数据共享

2016-05-29 20:40 225 查看
</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:18
Thread-1put data:36
Thread[Thread-1,5,main]use A get data:36
Thread[Thread-0,5,main]use A get data:18
Thread[Thread-1,5,main]use B get data:36
Thread[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() {

@Override
public 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());
}

9dd1
}

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(){}

@Override
public 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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: