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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高志鹏 中级黑马   /  2012-10-29 22:06  /  1481 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 高志鹏 于 2012-10-29 22:53 编辑

这个是毕老师讲解的有关售票的问题。


第一张图是毕老师说的创建线程的第一种方法,同时开4个线程,然后可以调用静态的int票数来实现4个线程卖同100张票,这个我可以理解。
但是第二张图的是实现Runnable接口的方法建立的4个线程。他们调用的都是run方法,为什么票的资源就可以被4个线程所共享,总数是100张票。而不是像继承那样,用了4个线程却有了400张票?

未命名.jpg (53.54 KB, 下载次数: 35)

未命名.jpg

QQ截图20121029215803.png (71.17 KB, 下载次数: 35)

QQ截图20121029215803.png

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

5 个回复

倒序浏览
用接口实现和直接创建线程没什么区别,都是四个线程,关键是看用的是不是同一把锁。
回复 使用道具 举报
因为第二种方式四个线程执行的是Runnable接口子类对象的run方法,该对象只有一个,所以它们执行的run方法是同一个,而run方法中操作的ticket也是本类对象的成员变量,也只有一份,所以只有100张票。而继承方式时,每个线程对象执行的是自己的run方法,而且每个对象中都有100张票,所以有400张。

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

回复 使用道具 举报
因为四个线程共用Ticket的对象t作为参数创建线程。

四个线程都调用t对象中的run方法作为其运行代码,也就是四个线程同时卖t对象中的100张票。

所以,票的总数是100张,而不是400张。
回复 使用道具 举报
第一张图是Ticket继承了Thread,
而你
Ticket t1=new Ticket();
Ticket t2=new Ticket();
Ticket t3=new Ticket();
Ticket t4=new Ticket();
是建立四个不同的对象,也就意味着400张票。
Ticket t=new Ticket();
Thread t1=new Thread(t);     //用的是同一对象
Thread t2=new Thread(t);   
而第二种方法,

共享的是一个对象,所以卖的是100张票
回复 使用道具 举报
关键是看他们操作的是不是同一个资源
如果是
Ticket t1 =new Ticket();
Ticket t2=new Ticket();
Ticket t3 =new Ticket();
Ticket t4 =new Ticket();

这是四个资源而
Ticket t = new Tecket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);

都是操作同一个资源t
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马