黑马程序员技术交流社区

标题: 多线程中的一个疑惑 [打印本页]

作者: 余明辉    时间: 2012-8-5 20:06
标题: 多线程中的一个疑惑
为什么要给Thread类的构造方法传递Runnable的子类对象?
多线程的知识点,总是学的懵懵懂懂的
作者: 胡文凡    时间: 2012-8-5 20:16
...看api啊,它的构造方法就是接收一个Runnable的实例啊。实现了Runnable接口就可以当做线程用了。。
作者: 朱烈葵    时间: 2012-8-5 21:10
创建线程的方法有两个
1,继承Thread类
Thread是线程类是吧,创建线程是new Thread()或 newThread(Runnable r);
我的理解是设计思想的问题,你看java不支持多继承,如果工人继承了人,就不能继承Thread类了,就不能实现多线程了。
2.实现runnable接口
这个时候工人就可以继承人类实现Runnable接口复写run方法,来实现多线程
但是要启动线程要通过Thread类的start方法,来完成,所以Thread提供了构造函数来接受ruannable接口的子类。
设计思想大概就是这样,我也是半懂,呵呵,希望对你有用!
作者: 叶征东    时间: 2012-8-6 00:04
因为JAVA是单继承的,当一个类继承了Thread类,就不能继承其它的类,而实现runnable接口则可以继承其它的类了,所以实现runnable接口的扩展性比继承Thread类好。
作者: 余明辉    时间: 2012-8-6 20:59
谢谢各位,我已经明白了,把Runnable的实现类传给Thread,是因为只有Thread类有start方法
问题已经解决
作者: 张振纲    时间: 2012-8-6 21:07
实现多线程有两种方法

第一种是继承Thread类,然后建立线程复写.run方法,最后通过.start来启动线程
这种方法有个缺陷就是java无法多继承,所以有很大的局限性

第二种就是通过实现Runnable接口,然后再创建的类中复写run方法,然后创建线程对象即Thread类的对象
然后将Runnable接口的子类对象作为参数传给Thread即可,这种方法的好处是,既实现了多线程,又可以继承别的父类


作者: 郑彬    时间: 2012-8-6 21:59
创建线程的第一种方式:继承Thread类。
步骤:
1,定义类继承Thread。
2,复写Thread类中的run方法。
    目的:将自定义的代码存储在run方法中。让线程运行。
3,建立线程对象,调用线程对象的start方法,该方法两个作用:启动线程,调用run方法。
创建线程的第二种方式:实现runnable接口。
步骤:
1,定义类实现Runnable接口
2,覆盖Runnable接口中的run方法。将线程要运行的代码存放在该run方法中。
3,通过Thread类建立线程对象。
4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。       
5,调用Thread类对象的start方法开启线程并调用Runnable接口子类的run方法。
实现方式和继承方式有什么区别呢?
实现方式好处:避免了单继承的局限性。
在定义线程时,建议使用实现方式。

为什么要将Runnable接口的子类对象传递给Thread的构造函数。
因为,自定义的run方法所属的对象是Runnable接口的子类对象。
所以要让线程去执行指定对象的run方法。就必须明确该run方法所属对象,所以必须将该run方法所属对象传递给Thread类的构造函数。




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