黑马程序员技术交流社区

标题: 两种线程的不同求解释? [打印本页]

作者: wupingtanlu    时间: 2012-5-5 08:56
标题: 两种线程的不同求解释?
线程有两种方式 :
1.继承  Thread类 然后覆盖run方法
2.实现 runnable接口 中的run方法
请问 两种方式 有什么不同呢?为什么,用接口的方式是最常用的呢?线程池创建线程不知道是不是线程的一种创建方式?
作者: 胡奎    时间: 2012-5-5 12:15
JAVA不支持多继承,但支持可以实现多个接口,如果一个类继承了Thread,那么该类则无法在继承其他的类,相反,如果使用继承方式,则不受限制,
作者: 赵玮_Tom    时间: 2012-5-5 12:46
用实现接口的方式创建线程比继承类的方式创建线程有两个好处:
1. java不支持多继承,如果一个类(如Student)继承已经继承了一个类(如Person),那么就不能使用继承方式创建线程了。同样,如果该类已经通过继承Thread方式创建了线程,就不能再继承其他类了。而采用实现Runnable接口的方式创建线程,则不存在此局限。
2. 实现Runnable接口创建线程可以实现多个线程对要操作的资源共享。而继承Thread类创建线程,各个线程操作的资源是独立的。(参考多窗口卖票程序)
作者: 何阳    时间: 2012-5-5 13:19
第一种是继承父类的方法,Thread类就是创建进程的类,里面有执行任务的代码,run方法,
我们继承它,是想通过它来创建线程,但是我们想执行自己的任务,所以我们应该复写run方法,
在里面加入自己想要运行的代码。
第二种是实现Runable接口,在类中复写run方法,此时我们是将我们要运行的任务封装成对象,
通过进程的Thread构造函数来创建进程的。这个也是创建了一个进程。
class Test
{
        public static void main(String[] args)
        {
                //创建线程的第一种方法,继承Thread类
                //创建2个任务同时执行
                Preson a=new Preson();
                Preson b=new Preson();
                //开启线程
                a.start();
                b.start();
                //创建线程的第二种方法,实现Runable接口,
                //将任务封装成对象传递给线程
                Student s=new Student();
                //开启两条线程,执行同一任务
                Thread t=new Thread(s);
                Thread t1=new Thread(s);
                t.start();
                t.start();
        }
}
作者: 蒋映辉    时间: 2012-5-5 13:43
其实线程的创建不只是这两种方法,例如,还有使用继承Callable接口一样,Callable与Runnable其实差不多,只是Callable可以传递参数而Callable不可以。
一般来说,用继承Thread最直观,也最容易理解,但是它是通过继承来实现的,我们知道,JAVA只允许单继承,你写的类继承了Thread的话就不能继承其他类了,这样很有局限性。而Runnable与Callable是通过借口实现的,不影响你继承其他的类,所以它用得比较多。
至于线程池,它不是给你创建线程用的,而是管理线程用的,所以就算你使用线程池,你也要在上面的方法中选择一种。
作者: 袁錦泰    时间: 2012-5-6 01:26
创建线程方式一:继承Thread类
1.由于JAVA只支持单继承,Thread子类无法再继承其它类.
2.编写简单,run()方法的当前对象就是线程对象,可直接操作.
3.被创建的线程独立化,无法实现多线程操作数据的共享
创建线程方式二:实现Runnable接口
1.由于JAVA支持单继承与多实现同时进行,可以在实现接口的同时继承其他功能和属性,从而得到线程功能的扩展
2.将CUP/代码/数据分离,形成清晰的模型
3.被创建的线程可以实现多线程操作数据的共享
作者: 谭景宾    时间: 2012-5-6 01:44
Thread类用户继承,但是java只支持单继承,有局限性,如果继承Thread的类还有其他共同的属性或方法需要继承父类,则无法继承。
runnable接口解决了这一问题,java支持多实现,实现runnable接口的类,还可以实现别的接口,解决了单继承的局限性




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