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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 泮和顺 中级黑马   /  2012-3-11 13:55  /  2406 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

是不是用实现接口runnable可以实现的同步 用继承Thread也一定能也可以做到,反之亦然??还有例如其他的一些接口类和主类也是一样??

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

9 个回复

倒序浏览
Runnable接口可以实现实现类似类的多继承。由于java的单根继承,所以你继承了Thread类就不能继承其他类型,或者说你继承了其他类型就不能继承Thread类型,你可以implements Runnable就可以使其实现多线程。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
创建线程的方法有两个:  1 继承Thread类 2 实现Runnable接口  当然定义线程时建议使用第二种方法。
实现方式的可以避免单继承的局限性,使程序可扩展性增加。  
两种方式的区别:   继承Thread将线程代码存放在Thread类的子类的run()中
                   实现Runnable将线程代码存放在接口的子类的run()方法中
你说的同步应该是多线程运行的安全问题了

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
接口runnable和Thread 都可实现多线程
开启一个窗口卖票,总共100张
前者可以实现该类的对象资源共享,点型的实现是窗口卖票问题,它是几个对象共卖100张票
后者不可以实现资源的共享,而是独自卖自己的100张票

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
还没有学到。!
回复 使用道具 举报
创建线程的两种方式
1、定义线程类实现Runnable接口
     1>定义线程类Runnable接口      
            TM tm = new TM();
            Thread myThread = new Thread(tm) //tm为实现接口类Runnable
     2>使用Runnable接口可以为多线程提供共享数据

2、可以定义一个Thread的子类并重写run方法

注:最好使用第一种方法
最好使用方法1
            

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
java只能单继承,因此如果是采用继承Thread的方法,那么在以后进行代码重构的时候可能会遇到问题,因为你无法继承别的类了,在其他的方面,两者之间并没什么太大的区别
只有在调用了start方法后,线程才进入可运行状态(此时不一定会运行),当cpu时间片到的时候才会自动调用run方法,代码中无需调用run方法

如果实现的是Runnable接口,那么可以继承别的类,比继承Thread在某些地方更加方便

评分

参与人数 2技术分 +2 收起 理由
老罗 + 1
房宝彬 + 1

查看全部评分

回复 使用道具 举报
房宝彬 黑马帝 2012-3-11 21:45:59
8#
最重要的就是JAVA只支持但继承,如果用Thread的话,是占用了一个继承位置,用接口的Runnable,可以提高程序的扩展性,  Runnable与Thread的线程原理都是一样的..建议用接口的Runnable开启线程

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
在JAVA语言中类和类之间是单继承的,而接口和接口之间是多继承的.也就是说,如果你继承了Thread类之后就再也不能继承其他的类了,这在实际开发中是相当不方便的.而实现Runnable接口就不会有这个麻烦了,因为接口是多继承的,你实现一个接口之后只要你需要就可以继续实现其他的接口而没有任何限制.从这一点上来说,实现Runnable比继承Thread要好许多。
  Runnable接口只有一个方法,那就是run( ),但是如果你想对它做一些Thread对象才能做的事情(比方说toString( )里面的getName( )),你就必须用Thread.currentThread( )去获取其reference。Thread类有一个 构造函数,可以拿Runnable和线程的名字作参数。
  如果对象是Runnable的,那只说明它有run( )方法。这并没有什么特别的,也就是说,不会因为它是Runnable的,就使它具备了线程的先天功能,这一点同Thread的派生类不同的。所以你必须像例程那样,用Runnable对象去创建线程。把Runnable对象传给Thread的构造函数,创建一个独立的Thread对象。接着再调用那个线程的start( ),由它来进行初始化,然后线程的调度机制就能调用run( )了。
  Runnable interface的好处在于,所有东西都属于同一个类;也就是说Runnable能让你创建基类和其它接口的mixin(混合类)。如果你要访问其它东西,直接用就是了,不用再一个一个地打交道。但是内部类也有这个功能,它也可以直接访问宿主类的成员。所以这个理由不足以说服我们放弃Thread的内部类而去使用Runnable的mixin。
  Runnable的意思是,你要用代码——也就是run( )方法——来描述一个处理过程,而不是创建一个表示这个处理过程的对象。在如何理解线程方面,一直存在着争议。这取决于,你是将线程看作是对象还是处理过程[68]。如果你认为它是一个处理过程,那么你就摆脱了"万物皆对象"的OO教条。但与此同时,如果你只想让这个处理过程掌管程序的某一部分,那你就没理由让整个类都成为Runnable的。
  在做项目的时候,有的时候你必须要实现Runnable,而不能继承Thread。原因很简单,因为java中,一个对象不能继承两个类,所以这个时候你只能去实现Runnable。
回复 使用道具 举报
OMG 中级黑马 2012-3-12 00:08:17
10#
baypm_jy 发表于 2012-3-11 14:33
接口runnable和Thread 都可实现多线程
开启一个窗口卖票,总共100张
前者可以实现该类的对象资源共享,点型 ...

如果要实现多线程(对象)共享一个资源(变量),有两种方法:1是继承Thread类,并用static修饰变量,让内存中的多个对象共享一个该变量(static修饰的变量在内存中只允许建立一个该变量)。2是实现Runnable接口,但要把变量定义在run方法外,建立一个对象,传给多个Thread对象。

引导:为什么建议用Runnable?
因为:继承了一个类之后,不能继承Thread类,但可以实现Runnable接口。
总结:在确定本来不会继承其他类时,可以继承Thread,否则实现Runnable。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马