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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李红亮 于 2013-10-17 08:28 编辑

大家好,我最近在学多线程,里面介绍到有3种方法来创建线程实现类的,我不知道用那种好,就是想挑其中的一种做完习惯来用,大家说用那种方法好尼;有什么优点,看书上一会用这种,
一会用那种,有时候会搞乱了,所以想挑一种作为习惯来用。希望大家给点建议。谢谢!



评分

参与人数 1黑马币 +3 收起 理由
周志龙 + 3

查看全部评分

12 个回复

倒序浏览
两种线程创建方式对比:
采用实现Runnable接口的方式的多线程:
(1)线程类只是实现了Runnable接口,该类还可以继承其它类;
(2)多个线程可以共享同一个target对象,非常适合多个线程来处理同一份资源,可以将CPU、代码和数据分开,形成清晰的模型,较好的体现了OOP思想;
(3)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。
采用继承Thread类方式的多线程:
(1)优点:编写简单,如果需要访问当前线程,可以直接使用this即可获取当前线程;
(2)缺点:继承了Thread类,就不能继承其它的父类。
实际上几乎所有的多线程程序都采用实现Runnable接口的方式。
这是我博客里的总结,我知道的2种创建线程的方法,不知道你说的第3种是什么?

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
一步一步来,方式要一个一个的掌握,你说的第三种就是老张最后7K讲的那种创立线程池的方法吧
回复 使用道具 举报
HM李超 发表于 2013-10-15 23:52
两种线程创建方式对比:
采用实现Runnable接口的方式的多线程:
(1)线程类只是实现了Runnable接口,该类 ...

还有一种是使用Callable和Future来创建线程的,这种更为复杂点,请问你是用那种多一点?
回复 使用道具 举报
周志龙 发表于 2013-10-16 08:12
一步一步来,方式要一个一个的掌握,你说的第三种就是老张最后7K讲的那种创立线程池的方法吧 ...

这个也是一种了,我说的第三种是使用Callable和Future来创建的,我现在是看书多,比较少看视频(*^__^*)
回复 使用道具 举报
Runnable接口,比较采用继承Thread类方式的多。不鼓励使用继承的方式来实现多线程!
回复 使用道具 举报
现在只学到两种,一种是继承Thread 复写run()方法,start()启动。这种有局限性。Java 只支持单继承,扩展性不够好。
还有一种是实现Runnable接口,复写run()方法,new Thread(实现接口类),start()。这种方法提高了程序的扩展性。
回复 使用道具 举报
李红亮 发表于 2013-10-16 08:17
还有一种是使用Callable和Future来创建线程的,这种更为复杂点,请问你是用那种多一点? ...

    你说的是JDK 1.5之后出现的新特性吧,就是实现Callable接口的这种形式,我觉得这个Callable看似是Runnable接口的增强版啊,功能肯定没的说,不过你都说了这种方式要稍微复杂一点,干嘛非用它呢,我宁愿用的简单一点,Runnable接口。可以实现大部分需求了。
     但是,看需求吧,万一项目中需要线程加强,就用Callable,我更喜欢Runnable,结构层次清晰
回复 使用道具 举报
凝聚 中级黑马 2013-10-17 08:16:00
9#
1、通过实现Runnable接口线程创建
(1).定义一个类实现Runnable接口,重写接口中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。
(2).创建Runnable接口实现类的对象。
(3).创建一个Thread类的对象,需要封装前面Runnable接口实现类的对象。(接口可以实现多继承)
(4).调用Thread对象的start()方法,启动线程
2、通过继承Thread类创建线程
(1).首先定义一个类去继承Thread父类,重写父类中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。
(2).直接创建一个ThreadDemo2类的对象,也可以利用多态性,变量声明为父类的类型。
(3).调用start方法,线程t启动,隐含的调用run()方法
3、两种方式的比较
首先分析两种方式的输出结果,同样是创建了两个线程,为什么结果不一样呢?
使用实现Runnable接口方式创建线程可以共享同一个目标对象(TreadDemo1 tt=new TreadDemo1();),实现了多个相同线程处理同一份资源。
然后再看一段来自JDK的解释:
Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为run 的无参数方法。
设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议。例如,Thread 类实现了Runnable。激活的意思是说某个线程已启动并且尚未停止。
此外,Runnable 为非 Thread 子类的类提供了一种激活方式。通过实例化某个Thread 实例并将自身作为运行目标,就可以运行实现 Runnable 的类而无需创建 Thread 的子类。大多数情况下,如果只想重写run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类创建子类。

采用继承Thread类方式:
(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
(1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
如果楼主已经有了答案,请将帖子改为"提问结束"
回复 使用道具 举报
HM李超 发表于 2013-10-16 21:14
你说的是JDK 1.5之后出现的新特性吧,就是实现Callable接口的这种形式,我觉得这个Callable看似是Run ...

恩,好,谢了哈!你是不是在黑马读了?
回复 使用道具 举报
凝聚 发表于 2013-10-17 08:16
1、通过实现Runnable接口线程创建
(1).定义一个类实现Runnable接口,重写接口中的run()方法。在run()方法中 ...

说的很详细,谢了(*^__^*)
回复 使用道具 举报
李红亮 发表于 2013-10-17 08:30
恩,好,谢了哈!你是不是在黑马读了?

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