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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ゞSunペ果果つ 中级黑马   /  2013-4-12 07:58  /  2039 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ゞ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();
他们的区别:
是不是因为第一个处理的是同一个对象,也就是他们线程处理的数据是同一个资源,
第二个是实例化了二个对象,所以他们的处理是互不影响的。他们的区别仅仅局限于此么?我就知道这些

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

10 个回复

倒序浏览
我知道也是只有这么多,希望版主知道了,也告诉我一声,谢谢
回复 使用道具 举报
本帖最后由 聖手`书生 于 2013-4-12 09:42 编辑

1.第一种情况就是两个线程同时处理new A();这个对象了,也就是说同时相互抢cpu执行权,都去执行new A();中的run方法。如果没有同步代码,有可能导致执行run中代码时数据错乱。
2.第二种情况是两个线程,分别执行a1、a2对象中的run方法,两者之间不存在抢执行同一个run方法问题,但是线程和线程之间还是会抢cpu执行权,只是这种执行方式不会出现数据错乱问题。
你的理解基本正确的。这个小知识点就是这么回事。{:soso_e113:}

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
对于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对象,虽然都是同一个类,但是不同对象,所以就等于分别处理

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
你这个可以先去了解下 引用类型和值类型的区别, 第一个不管你写多少个线程,都是在操作同一个类,因为他们都指向同一个内存地址
第二个就不同,相当2个类,2个地址

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
atwell 发表于 2013-4-12 09:42
你这个可以先去了解下 引用类型和值类型的区别, 第一个不管你写多少个线程,都是在操作同一个类,因为他们 ...

第一个操作的是同一个对象。第二个操作的是2个对象,说类,不太合适O.O
回复 使用道具 举报
Asan 发表于 2013-4-12 08:41
我知道也是只有这么多,希望版主知道了,也告诉我一声,谢谢

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

:lol有其他的时候一起讨论
回复 使用道具 举报
罗家辉 发表于 2013-4-12 09:42
对于A类她实现了Runnable接口,但是她也有自身的属性,所以new出来的对象可能对它进行属于自己对象的初始化 ...

:lol你说的这个我了解的,同样谢谢你
回复 使用道具 举报
首先,实例化Thread的时候,需给其构造函数传一委托类型的参数,也就是把一个方法作为参数传进去了。
第一种情况:两个线程执行的同一个方法,操作同一资源,可能会出现当一个线程刚刚拿到这个资源但还没开始操作,另一个线程就抢过去了,即传说的方法重入问题。解决这个问题的办法就是线程同步,即可以用Lock锁锁住要执行的代码。
第二种情况:如果赋值给委托变量的两个方法,操作了同一全局变量,也可能会有多方法重入的问题,但如果操作的是局部变量,则会互不影响。
以上是个人理解,仅供参考。

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
黑马田杰 发表于 2013-4-12 13:40
首先,实例化Thread的时候,需给其构造函数传一委托类型的参数,也就是把一个方法作为参数传进去了。
第一 ...

嗯,理解很深刻
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马