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]
相关文章推荐
- 理工OJ刷题分数晋级前三十——纪念一下(坚持才是你对)
- 让开发自动化: 选择持续集成服务器
- Git Github jekyll,gem Liquid模板语言 Markdown
- bzoj3262: 陌上花开
- Least Squares Method & Gradient Descent
- 五月英语总结
- 双调旅程(bitonic tour)问题(POJ2677、ZOJ2096)
- hibernate进阶之路(一)
- 最简短总结-整数快速幂
- 《JavaScript学习笔记四》:getElementsByTagName的使用以及全选、反选和取消功能实现
- 学习python——处理mysql
- python unittest 之mock学习笔记(续一)
- 使用maven mvn archetype:create 创建maven项目出错
- win8.1系统快速关机的两种方法
- serservlet 一生
- Android SurfaceView实战 打造抽奖转盘
- 【设计模式】创建型模式之原型Prototype
- android shape详解
- 冲刺07
- 博客第一篇