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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class Test
{
        public static void main(String[] args)
        {
                //Demo1 d = new Demo1();
                Demo2 d = new Demo2();
               
                Thread t1 = new Thread(d);
                Thread t2 = new Thread(d);

                t1.start();
                t2.start();

        }
}

class Demo1 extends Thread
{
        public void run()
        {
                for(int x=0; x<6; x++)
                {
                        System.out.println("x="+x);
                }
        }
}

class Demo2 implements Runnable
{
        public void run()
        {
                for(int x=0; x<6; x++)
                        {
                                System.out.println("x="+x);
                        }
        }
}
以上是建立两种线程方式,这两种方式有什么优劣吗?在什么情况下用第一种或者这第二种?

6 个回复

正序浏览
实现runable接口多线程可以对一个数据建立多个线程。
extends thread 是建立多个线程对自己单独数据进行处理,
java支持单继承多实现。用实现的方法更加灵活。
回复 使用道具 举报

采用继承Thread类方式:
(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
实现方式和继承方式有什么区别呢?
实现方式好处:避免了单继承的局限性。
在定义线程时,建议使用实现方式。

两种方式的区别:
继承Thread:线程代码存放在Thread子类run()方法中。
实现Runnable:线程代码存放在Runnable接口子类的run()方法中。

回复 使用道具 举报
实现方式和继承方式有什么区别呢?
实现方式好处:避免了单继承的局限性。
在定义线程时,建议使用实现方式。

两种方式的区别:
继承Thread:线程代码存放在Thread子类run()方法中。
实现Runnable:线程代码存放在Runnable接口子类的run()方法中。

Runnable接口的设计原理:
1.Ticket类如果是继承了Thread类就不能再继承其他类了
2.假设我有一个学生类,其中有一部分代码需要被多线程所执行。
3.所以我先想到的是让它去继承Thread类
4.并学生类复写Thread类的run方法
-----------------------------------
5.紧接着我的体系发生了变化
6.还是学生类,他在和工人类不断向上抽取的过程中产生了一个父类Person类
7.学生类继承了Person类,可是学生类还有一些代码需要被多线程所执行
8.这是学生类就不能再继承Thread类了。
9.Java工程师们在设计的时候就发现这个问题了。
10.Java只支持单继承,那么当你这个类有了自己的父类,你就不能再继承Thread.
11.但是,你的类里又还有些代码是需要被多线程所执行的。
12.这时候,Java工程师就对外给程序员们提供了一个规则。
13.你可以不是我的子类,你的代码我也能帮你执行。
14.但是前提是:你必须符合我的规则,我才能帮你办。(接口)
15.这时候就有了一个可运行的接口Runnable
16.学生类可以通过复写接Runnable接口唯一的run()方法来实现Runnable。
17.学生是人类的一种,学生像Runnable接口
18.接口的由来也就明确了。
19.学生继承人的同时还能同时实现接口,接口的好处是对外提供了功能性的扩展。
20.学生既具备了人的特性并又扩展了自己的功能,还能被多线程所操作。
*/
回复 使用道具 举报
采用继承Thread类方式:
(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
(1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。
回复 使用道具 举报
其实两种方式,都可以实现多个线程操作相同数据。。。只不过实现Runnable接口,可以将线程任务从线程对象中分离,避免了单继承的局限性。
回复 使用道具 举报
本帖最后由 几番意难相付 于 2014-1-4 20:01 编辑

实现Runnable接口的方法,可以在多个线程中,操作同一个数据。
而继承Thread类的方法,只能在不同的线程中,操作每个线程独立的数据。
一般情况 还是建议使用实现Runnable接口的方法来创建多线程
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马