设为首页 加入收藏

TOP

Java5 多线程(一)--入门篇(四)
2014-11-24 12:00:00 来源: 作者: 【 】 浏览:160
Tags:Java5 线程 入门
Age(int age) {
this.age = age;
}
}
上面的例子,对于线程范围内共享对象是一个比较优雅的设计方案,ThreadShareData 有name和age两个属性,这个类的实例是与每个线程相关的.那么这个设计就交给这个类自己吧,其他用户在任意线程调用我这个类的方法,自然而然就是与线程相关的实例.因为里面我们封装了一个ThreadLocal对象.
那么我们是否考虑到如果成千上万的线程来访问,那么是不是可能会导致内存溢出呢
其实当一个线程死亡,那么 系统会把该线程在ThreadLocal产生的数据清除掉,
5,多个线程访问共享对象和数据的方式:
1>如果每个线程执行的代码相同,额可以使用相同的Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统可以这么来实现
[java]
ring[] args) {
MyRunnable myRunnable = new MyRunnable();
new Thread(myRunnable).start();
new Thread(myRunnable).start();
new Thread(myRunnable).start();
new Thread(myRunnable).start();
}
static class MyRunnable implements Runnable {
int count = 100;
@Override
public void run() {
synchronized (this) {//同步
while (true) {
if (count > 0) {
try {
//模拟线程安全问题,所以要同步/互斥
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
count--;
} else {
break;
}
System.out.println(count);
}
}
}
}
2>如果每个线程执行的代码不同,比如一个线程对一个整形执行加操作,另一个线程对该整形进行减操作.
这时候需要用不同的Runnable对象,有如下三种方式来实现这些Runnable对象的数据共享.
①将共享数据封装在另外一个对象中,然后将这个对象逐一传递给各个Runnable对象,每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现针对该数据进行各个操作的互斥和通信.
[java]
public static void main(String[] args) {
ShareData shareData = new ShareData();
new Thread(new MyRunnable(shareData)).start();
new Thread(new MyRunnable2(shareData)).start();
}
static class MyRunnable implements Runnable {
private ShareData shareData;
public MyRunnable(ShareData shareData) {
this.shareData = shareData;
}
@Override
public void run() {
shareData.increase();
}
}
static class MyRunnable2 implements Runnable {
private ShareData shareData;
public MyRunnable2(ShareData shareData) {
this.shareData = shareData;
}
@Override
public void run() {
shareData.decrease();
}
}
static class ShareData {
int count = 100;
public void increase() {
count++;
}
public void decrease() {
count--;
}
}
②将这些Runnable对象作为某一类中的内部类,共享数据作为这个外部类中的成员变量,每个线程对共享数据的操作方法也分配给外部类,以便实现对共享数据进行各个操作的互斥和通信,作为内部类的各个Runnable对象调用外部类的这些方法.
[java]
static ShareData shareData = new ShareData();
public static void main(String[] args) {
//final ShareData shareData = new ShareData();
new Thread(new Runnable() {
@Override
public void run() {
shareData.decrease();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
shareData.increase();
}
}).start();
}
static class ShareData {
int count = 100;
public void increase() {
count++;
}
public void decrease() {
首页 上一页 1 2 3 4 5 下一页 尾页 4/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)