</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());
}
}
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]