黑马程序员技术交流社区
标题:
多线程的两种实现方式的问题?
[打印本页]
作者:
吉许
时间:
2011-10-31 12:15
标题:
多线程的两种实现方式的问题?
回顾毕老师的视频一点疑问:
为什么多线程的继承Thread方式如果多个线程操作一个数据对象要把该数据设置为静态,
而实现Runnable不用设置静态就可以实现多个线程操作一个数据资源.
作者:
张晨
时间:
2011-10-31 12:55
我是这么理解的
因为继承thread的本身就是一个类, 数据对象(专业叫域、字段,回复中使用LZ的称呼,下同) 就定义在这个类中 ,要多线程操作这个 数据对象,如果非静态,那么将会有两个 不同 数据对象的对象被创建,那么两个线程操作的数据对象就是独立的,起不到多线程的作用。然而使用静态的数据对象, 那么即使创建两个继承了thread的对象,JVM只创建一个数据对象,那么两个线程都是操作是同一个 数据对象,这样运算就是多线程,就快很多。
实现Runnable接口,仔细看代码的话,会发现其实发生了很大的不同,首先他会定义一个类,当作操作资源,把 数据对象独立放在这个资源类中,然后把这个资源类放入实现Runnable接口的类中操作,所以操作的还是一个类中的 数据对象, 这样多线程就有意义。
作者:
o火o把o
时间:
2011-10-31 12:56
1. 变量被 static 修饰后该变量不能被重新初始化,该类所有的实例方法公用这个变量.
这种方法的缺点是此变量在内存中生命周期比较长:从类被声明开始变量就一直存在了,直至类消失.
2. Runnable 是通过对方法 synchronized 同步(加锁) 来实现的.
作者:
黄健
时间:
2011-10-31 14:32
举个例子,比如一个人在打篮球,把人看成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();于是几个人共同玩一个篮球了,
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2