黑马程序员技术交流社区
标题:
请教多线程的一个小问题
[打印本页]
作者:
歌诗王道
时间:
2014-4-5 12:17
标题:
请教多线程的一个小问题
本帖最后由 歌诗王道 于 2014-4-6 10:35 编辑
关于毕老师的java视频,用实现接口的方式建立多线程不是也new了4个对象吗?为什么能把Ticket类里的成员变量tick独立出来变成共享呢?而继承thread类却不行?
作者:
歌诗王道
时间:
2014-4-5 12:37
就是售票的那个例子,Ticket类里面定义了100张(非静态),用继承Thread类来创建线程变成了400张,用实现Runable接口来创建线程却还是100张,为什么呢?
作者:
759345779
时间:
2014-4-5 13:39
票是共享资源,Thread不能实现共享资源,实现Runable接口可以实现共享资源,多个线程共同操作一个资源。
作者:
zhangbingyuan
时间:
2014-4-5 14:11
本帖最后由 zhangbingyuan 于 2014-4-5 14:13 编辑
使用实现Runnable接口的方式创建的线程可以处理同一资源,从而实现资源的共享。
利用扩展Thread类创建的多个线程,虽然执行的是相同的代码,但彼此相互独立,且各自拥有自己的资源,互不干扰,也就是说使用这种方法建立线程无法共享资源。
实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。这种方式不仅有利于程序的健壮性,使代码能够被多个线程共享,而且代码和数据资源相对独立,从而特别适合多个具有相同代码的线程去处理同一资源的情况。这样一来,线程、代码和数据资源三者有效分离,很好地体现了面向对象程序设计的思想。因此,几乎所有的多线程程序都是通过实现Runnable接口的方式来完成的。
作者:
请备注
时间:
2014-4-5 17:03
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
Ticket t3 = new Ticket();
Ticket t4 = new Ticket();
t1.start();
t2.start();
t3.start();
t4.start(); //这样是400张
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t); //这样是100张,看仔细,我也搞晕过
作者:
syusikoku
时间:
2014-4-5 17:23
我们直接使用继承Thread的方式创建线程。线程的任务都是独立的。每个线程执行的任务是没有关联的。
我们把线程执行的任务封装到Runnable对象中。然后再传递给Thread的构造函数。这种方式创建出来的线程。它们执行的任务都是同一个。使用这种方式可以实现线程的数据共享。
作者:
Engle
时间:
2014-4-5 17:41
1.继承Thread类的,我们相当于拿出四件事即四个卖票100张的任务分别分给四个窗口,他们各做各的事各卖各的票各完成各的任务,因为Ticket继承Thread类,所以在new Ticket()的时候在创建四个对象的同时创建了四个线程;
2.实现Runnable的, 相当于是拿出一个卖票100张得任务给四个窗口去共同完成,new Ticket()相当于那一个任务,然后实例化四个Thread,去完成这一个任务。
总之,
一个是多个线程分别完成自己的任务,一个是多个线程共同完成一个任务。
大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类(Thread)创建子类。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2