设为首页 加入收藏

TOP

Java5 多线程(一)--入门篇(三)
2014-11-24 12:00:00 来源: 作者: 【 】 浏览:162
Tags:Java5 线程 入门
k = new Random().nextInt();
System.out.println(Thread.currentThread().getName()
+ " put value to i " + k);
new A().get();
new B().get();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
//模块A
static class A {
public void get() {
System.out.println("A from " +Thread.currentThread().getName() + " get value "+ k);
}
}
//模块B
static class B {
public void get() {
System.out.println("A from " +Thread.currentThread().getName() + " get value "+ k);
}
}
现在我们需要这样的效果,假设线程0给i赋值为1,那么当线程0取的时候也是1,也就是说线程之间取各自放进去的值.而上面的程序达不到这样的要求. 这就需要线程范围内的数据共享.
那么我们可以这样来实现,这也是线程范围内数据共享的原理.
定义一个Map集合key和value分别为Thread和Integer.
把给i赋值的代码替换为
int k =new Random().nextInt();
map.put(Thread.currentThread(), k);
get()方法内的代码改为
System.out.println("A from " + Thread.currentThread().getName()
+ " get value " + map.get(Thread.currentThread()));
这样的话就实现了线程范围内的数据共享了,线程取得值是各自放进去的.
这有什么用呢 比如事务,所谓事务的回滚和提交指的是在一个线程上的,如果是在不同的线程上,那么逻辑就乱了.这不是我们想要的,这样的话我们就可以通过线程范围内共享数据,也就是把连接绑定到该线程上,那么在该线程获取的连接是同一个连接.
下面通过ThreadLocal来实现这样的功能.
[java]
public class ThreadLocalTest {
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
int k = new Random().nextInt();
ThreadShareData.getThreadShareData().setAge(k);
ThreadShareData.getThreadShareData().setName("name" + k);
System.out.println(Thread.currentThread().getName()
+ " put value to i " + k);
new A().get();
new B().get();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
// 模块A
static class A {
public void get() {
ThreadShareData data = ThreadShareData.getThreadShareData();
System.out.println("A from " + Thread.currentThread().getName()
+ " get value " + data.getName() + "--" + data.getAge());
}
}
// 模块B
static class B {
public void get() {
ThreadShareData data = ThreadShareData.getThreadShareData();
System.out.println("B from " + Thread.currentThread().getName()
+ " get value " + data.getName() + "--" + data.getAge());
}
}
}
class ThreadShareData {
private static ThreadLocal local = new ThreadLocal ();
private ThreadShareData() {
}
public static ThreadShareData getThreadShareData() {
ThreadShareData data = local.get();
if (data == null) {
data = new ThreadShareData();
local.set(data);
}
return data;
}
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 set
首页 上一页 1 2 3 4 5 下一页 尾页 3/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇JDK,JRE,JVM区别与联系 下一篇设计包含max函数的队列

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·About - Redis (2025-12-26 08:20:56)
·Redis: A Comprehens (2025-12-26 08:20:53)
·Redis - The Real-ti (2025-12-26 08:20:50)
·Bash 脚本教程——Li (2025-12-26 07:53:35)
·实战篇!Linux shell (2025-12-26 07:53:32)