黑马程序员技术交流社区

标题: 线程一个小问题 [打印本页]

作者: ゞSunペ果果つ    时间: 2013-4-12 07:58
标题: 线程一个小问题
本帖最后由 ゞSunペ果果つ 于 2013-4-13 09:29 编辑

假设有A类,他实现了runable接口。
情况一:
A a =new A();
Thread t1=new Thread(a);
Thtead t2=new Thread(a);
t1.start();
t2.start();
情况二:
A a1 =new A();
A a2 =new A();
Thread t1=new Thread(a1);
Thtead t2=new Thread(a2);
t1.start();
t2.start();
他们的区别:
是不是因为第一个处理的是同一个对象,也就是他们线程处理的数据是同一个资源,
第二个是实例化了二个对象,所以他们的处理是互不影响的。他们的区别仅仅局限于此么?我就知道这些
作者: Asan    时间: 2013-4-12 08:41
我知道也是只有这么多,希望版主知道了,也告诉我一声,谢谢
作者: 聖手`书生    时间: 2013-4-12 09:39
本帖最后由 聖手`书生 于 2013-4-12 09:42 编辑

1.第一种情况就是两个线程同时处理new A();这个对象了,也就是说同时相互抢cpu执行权,都去执行new A();中的run方法。如果没有同步代码,有可能导致执行run中代码时数据错乱。
2.第二种情况是两个线程,分别执行a1、a2对象中的run方法,两者之间不存在抢执行同一个run方法问题,但是线程和线程之间还是会抢cpu执行权,只是这种执行方式不会出现数据错乱问题。
你的理解基本正确的。这个小知识点就是这么回事。{:soso_e113:}
作者: 罗家辉    时间: 2013-4-12 09:42
对于A类她实现了Runnable接口,但是她也有自身的属性,所以new出来的对象可能对它进行属于自己对象的初始化,
A a1 =new A();和A a2 =new A();也就是说a1和a2需然都是A类的对象,但是他们在堆内存中各自分配一个空间,
Thread t1=new Thread(a1);Thtead t2=new Thread(a1);这样就搞出2条线程来,他们都是对应a1对象,访问得是A类中a1的实例化,他们线程处理的数据是同一个资源
Thread t1=new Thread(a1);Thtead t2=new Thread(a2);这样的2条线程,他们一条是对应a1对象,另一条是对应a2对象,虽然都是同一个类,但是不同对象,所以就等于分别处理
作者: atwell    时间: 2013-4-12 09:42
你这个可以先去了解下 引用类型和值类型的区别, 第一个不管你写多少个线程,都是在操作同一个类,因为他们都指向同一个内存地址
第二个就不同,相当2个类,2个地址
作者: ゞSunペ果果つ    时间: 2013-4-12 12:15
atwell 发表于 2013-4-12 09:42
你这个可以先去了解下 引用类型和值类型的区别, 第一个不管你写多少个线程,都是在操作同一个类,因为他们 ...

第一个操作的是同一个对象。第二个操作的是2个对象,说类,不太合适O.O
作者: ゞSunペ果果つ    时间: 2013-4-12 12:15
Asan 发表于 2013-4-12 08:41
我知道也是只有这么多,希望版主知道了,也告诉我一声,谢谢

我会的,如果有更深的理解我会告诉你的。
作者: ゞSunペ果果つ    时间: 2013-4-12 12:24
聖手`书生 发表于 2013-4-12 09:39
1.第一种情况就是两个线程同时处理new A();这个对象了,也就是说同时相互抢cpu执行权,都去执行new A();中 ...

:lol有其他的时候一起讨论
作者: ゞSunペ果果つ    时间: 2013-4-12 12:25
罗家辉 发表于 2013-4-12 09:42
对于A类她实现了Runnable接口,但是她也有自身的属性,所以new出来的对象可能对它进行属于自己对象的初始化 ...

:lol你说的这个我了解的,同样谢谢你
作者: 黑马田杰    时间: 2013-4-12 13:40
首先,实例化Thread的时候,需给其构造函数传一委托类型的参数,也就是把一个方法作为参数传进去了。
第一种情况:两个线程执行的同一个方法,操作同一资源,可能会出现当一个线程刚刚拿到这个资源但还没开始操作,另一个线程就抢过去了,即传说的方法重入问题。解决这个问题的办法就是线程同步,即可以用Lock锁锁住要执行的代码。
第二种情况:如果赋值给委托变量的两个方法,操作了同一全局变量,也可能会有多方法重入的问题,但如果操作的是局部变量,则会互不影响。
以上是个人理解,仅供参考。
作者: ゞSunペ果果つ    时间: 2013-4-12 14:08
黑马田杰 发表于 2013-4-12 13:40
首先,实例化Thread的时候,需给其构造函数传一委托类型的参数,也就是把一个方法作为参数传进去了。
第一 ...

嗯,理解很深刻




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2