黑马程序员技术交流社区

标题: 创建多线程的问题 [打印本页]

作者: 高志鹏    时间: 2012-10-29 22:06
标题: 创建多线程的问题
本帖最后由 高志鹏 于 2012-10-29 22:53 编辑

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


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

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

未命名.jpg

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

QQ截图20121029215803.png

作者: 周斌    时间: 2012-10-29 22:32
用接口实现和直接创建线程没什么区别,都是四个线程,关键是看用的是不是同一把锁。

作者: 刘士林    时间: 2012-10-29 22:33
因为第二种方式四个线程执行的是Runnable接口子类对象的run方法,该对象只有一个,所以它们执行的run方法是同一个,而run方法中操作的ticket也是本类对象的成员变量,也只有一份,所以只有100张票。而继承方式时,每个线程对象执行的是自己的run方法,而且每个对象中都有100张票,所以有400张。
作者: 赵云柯    时间: 2012-10-29 22:33
因为四个线程共用Ticket的对象t作为参数创建线程。

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

所以,票的总数是100张,而不是400张。
作者: 崔政    时间: 2012-10-29 22:36
第一张图是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张票
作者: 罗力    时间: 2012-10-29 22:44
关键是看他们操作的是不是同一个资源
如果是
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




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