线程范围内数据共享

java实现线程范围内数据共享:
Thread.crruntThread()
使用HashMap<Thread,Object>

经过A,B,C三个模块都是获得同一个值
public class ThreadDemo20 {
private static HashMap<Thread,Integer> data=new HashMap<Thread,Integer>();

static class A{
public void getData(){
Thread t=Thread.currentThread();
int value=data.get(t);
System.out.println(t.getName()+" from A getData "+value);
}
}
static class B{
public void getData(){
Thread t=Thread.currentThread();
int value=data.get(t);
System.out.println(t.getName()+" from B getData "+value);
}
}
static class C{
public void getData(){
Thread t=Thread.currentThread();
int value=data.get(t);
System.out.println(t.getName()+" from C getData "+value);
}
}

public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
int value=new Random().nextInt(1000);
data.put(Thread.currentThread(), value);
A a1=new A();
a1.getData();
B b1=new B();
b1.getData();
C c1=new C();
c1.getData();
}
}).start();;
}
}
}


执行结果
Thread-1 from A getData 521
Thread-1 from B getData 521
Thread-1 from C getData 521
Thread-0 from A getData 925
Thread-0 from B getData 925
Thread-0 from C getData 925

java中提供了Threadlocal类已经实现了该
Threadlocal<Integer> tl=new Threadlocal<Integer>()
t1.get();
[b]使得该类在创建对象时候直接就是同一个线程同一个对象 对象不同线程不同,就像你登录后获得你的当前登录的用户时候不会获得别人的用户[/b]
[b]来点实际的:[/b]
public class UserService {

private static ThreadLocal<UserService> tl = new ThreadLocal<UserService>();

private UserService() {}

public static UserService getInstance() {
UserService us = tl.get();
if (us == null) {
us = new UserService();
tl.set(us);
}
return us;
}

}

这个大家应该再熟悉不过了。我们使用多个线程来测试一下
public class UserServiceTest {

public static void main(String[] args) {
for (int i = 0; i < 4; i++) {
new Thread(new Runnable() {
@Override
public void run() {
A a=new A();
a.print();
B b=new B();
b.print();
}
}).start();
}
}

static class A {
public void print() {
UserService us = UserService.getInstance();
System.out.println("from A "+Thread.currentThread().getName() + "..." + us);
}
}

static class B {
public void print() {
UserService us = UserService.getInstance();
System.out.println("from B "+Thread.currentThread().getName() + "..." + us);
}
}
}

测试结果是:同一个线程的UserService是相同的,不论是在A或者B中都能够获得
from A Thread-3...thread.UserService@787d6a
from A Thread-0...thread.UserService@1f4cbee
from A Thread-1...thread.UserService@1f4cbee
from A Thread-2...thread.UserService@787d6a
from B Thread-2...thread.UserService@787d6a
from B Thread-3...thread.UserService@787d6a
from B Thread-0...thread.UserService@1f4cbee
from B Thread-1...thread.UserService@1f4cbee
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值