A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吉许 黑马帝   /  2011-10-31 12:15  /  2411 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

回顾毕老师的视频一点疑问:
为什么多线程的继承Thread方式如果多个线程操作一个数据对象要把该数据设置为静态,
而实现Runnable不用设置静态就可以实现多个线程操作一个数据资源.

评分

参与人数 1技术分 +1 收起 理由
李印东老师 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
张晨 黑马帝 2011-10-31 12:55:00
沙发
我是这么理解的
    因为继承thread的本身就是一个类, 数据对象(专业叫域、字段,回复中使用LZ的称呼,下同) 就定义在这个类中 ,要多线程操作这个 数据对象,如果非静态,那么将会有两个 不同 数据对象的对象被创建,那么两个线程操作的数据对象就是独立的,起不到多线程的作用。然而使用静态的数据对象, 那么即使创建两个继承了thread的对象,JVM只创建一个数据对象,那么两个线程都是操作是同一个 数据对象,这样运算就是多线程,就快很多。
   
    实现Runnable接口,仔细看代码的话,会发现其实发生了很大的不同,首先他会定义一个类,当作操作资源,把 数据对象独立放在这个资源类中,然后把这个资源类放入实现Runnable接口的类中操作,所以操作的还是一个类中的 数据对象, 这样多线程就有意义。

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
1. 变量被 static 修饰后该变量不能被重新初始化,该类所有的实例方法公用这个变量.
这种方法的缺点是此变量在内存中生命周期比较长:从类被声明开始变量就一直存在了,直至类消失.
2. Runnable 是通过对方法 synchronized 同步(加锁) 来实现的.

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

回复 使用道具 举报
黄健 黑马帝 2011-10-31 14:32:03
板凳
举个例子,比如一个人在打篮球,把人看成Thread子类实例对象,人要打篮球,所以他要有球吧,所以这样写
class Person extends Thread{
String basketbal = new String("篮球");
public void run(){
while(true){
System.out.println(basketbal);
}
}
}
这样当你new一个Person 对象并调用他的start方法后,他就不停的打篮球了,当你想让多个人来打篮球时,就又new了几个Person 对象并调用各自的start方法,这时发现每new一个Person ,他都会自己带一个篮球,自己玩自己的,相互没有影响。于是你想让他们共同打一个篮球,这样才有看头,于是把篮球改为static String basketbal = new String("篮球");
这样他们就共同玩一个篮球了,相当于这几个人兑钱买一个篮球,大家都能玩。
如果这几个人都没有篮球时,也可以找别人借一个玩,于是写个球类
class Basketbal implements Runnable{
String basketbal = new String("篮球");
public void run(){
while(true){
System.out.println(basketbal);
}
}
}
这时他们再打篮球时,就可以先借个篮球,Basketbal  b = new Basketbal ();再new几个人来,并告诉他们借来的那个球他们都能玩,new Person(b).start();new Person(b).start();new Person(b).start();于是几个人共同玩一个篮球了,

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马