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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 歌诗王道 中级黑马   /  2014-4-5 12:17  /  1090 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 歌诗王道 于 2014-4-6 10:35 编辑

关于毕老师的java视频,用实现接口的方式建立多线程不是也new了4个对象吗?为什么能把Ticket类里的成员变量tick独立出来变成共享呢?而继承thread类却不行?

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

6 个回复

倒序浏览
就是售票的那个例子,Ticket类里面定义了100张(非静态),用继承Thread类来创建线程变成了400张,用实现Runable接口来创建线程却还是100张,为什么呢?
回复 使用道具 举报
票是共享资源,Thread不能实现共享资源,实现Runable接口可以实现共享资源,多个线程共同操作一个资源。
回复 使用道具 举报
本帖最后由 zhangbingyuan 于 2014-4-5 14:13 编辑

使用实现Runnable接口的方式创建的线程可以处理同一资源,从而实现资源的共享。
利用扩展Thread类创建的多个线程,虽然执行的是相同的代码,但彼此相互独立,且各自拥有自己的资源,互不干扰,也就是说使用这种方法建立线程无法共享资源。


实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。这种方式不仅有利于程序的健壮性,使代码能够被多个线程共享,而且代码和数据资源相对独立,从而特别适合多个具有相同代码的线程去处理同一资源的情况。这样一来,线程、代码和数据资源三者有效分离,很好地体现了面向对象程序设计的思想。因此,几乎所有的多线程程序都是通过实现Runnable接口的方式来完成的。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
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张,看仔细,我也搞晕过
回复 使用道具 举报
我们直接使用继承Thread的方式创建线程。线程的任务都是独立的。每个线程执行的任务是没有关联的。
我们把线程执行的任务封装到Runnable对象中。然后再传递给Thread的构造函数。这种方式创建出来的线程。它们执行的任务都是同一个。使用这种方式可以实现线程的数据共享。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
1.继承Thread类的,我们相当于拿出四件事即四个卖票100张的任务分别分给四个窗口,他们各做各的事各卖各的票各完成各的任务,因为Ticket继承Thread类,所以在new Ticket()的时候在创建四个对象的同时创建了四个线程;
2.实现Runnable的, 相当于是拿出一个卖票100张得任务给四个窗口去共同完成,new Ticket()相当于那一个任务,然后实例化四个Thread,去完成这一个任务。
总之,一个是多个线程分别完成自己的任务,一个是多个线程共同完成一个任务。
大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类(Thread)创建子类。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马