黑马程序员技术交流社区

标题: runnable与thread的区别和联系 [打印本页]

作者: 明天你好    时间: 2014-3-8 17:59
标题: runnable与thread的区别和联系
runnable与thread的区别和联系

作者: 上官睿鹏    时间: 2014-3-8 21:47
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口。继承相比实现接口有很大的局限性,一个类只有继承一个类但却可以继承多个接口。在java.lang包中Thread类也实现Runnable接口这也是它们之间的练习吧。
作者: 欧阳疯    时间: 2014-3-8 21:59
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限
作者: 郭帅帅    时间: 2014-3-8 23:23
首先runnable是一个接口,如果你定义一个类,(这个类非thread的子类,如果你没有继承thread类)并且想通过线程执行这个类里面的代码,那么就实现runnable这个接口。它里面有个默认的run方法,如果实现这个接口那么run方法就自动运行了,所以说你定义类的时候复写其中的run方法就行了,这样就能达到你想执行某些代码的目的。由于继承thread类有局限性(java只支持单继承),程序的可扩展性降低,通常定义线程都会实现runnable接口。大致的区别就是,继承thread类,线程代码存放在thread子类的run方法中。而实现runnable就是线程代码存放在接口子类的run方法中。
作者: 也许依然    时间: 2014-3-8 23:57
java中实现多线程的应用有两种途径,一种是用Thread类的子类创建线程,另一种是用Thread类创建线程。
Thread类综合了java程序中一个线程需要拥有的属性和方法,主要有:
构造方法,start(), run()等
当编写Thread的子类时,可以在子类中重写父类的run()方法,该方法中包含了线程的操作。这样程序在创建自己的线程时,只需要创建一个已定义好的Thread子类实例就好了。
Runnable是一个接口,该接口只有一个方法run(),所有实现Runnable接口的类都必须具体实现这个run()方法,为它提供方法体,并定义基本操作。当用Thread类的构造方法 public Thread(Runnable target)创建线程对象时,构造方法中的参数必须是一个具体的对象,该对象称作线程的目标对象,创建线程目标对象的类必须实现Runnable接口。当线程调用start()方法时,一旦轮到它来享用CPU,目标对象就会自动调用接口中的run()方法。所以一个实现了Runnable接口的类实际上定义了一个主线程之外的新线程操作。
作者: 徐芾清    时间: 2014-3-9 00:47
runnable是接口,是用来implements的
thread是类,需要extends
继承了thread类之后也就继承了其中的start方法,所以可以直接new这个对象并调换用start方法开启一个线程
但实现了runnable接口后还需要将该类的对象作为参数传递给一个thread类的对象,并调用这个thread类的对象的方法来开启一个线程
也就是:
如果Person extends Thread
那么new person().start();就可以开启一个线程
Person implements Runnable
则需要这样开启一个线程
new Thread(new Person()).start();
此外,由于java不支持多继承,所以继承thread有局限性,还是推荐实现runnable接口

作者: SyouRai_Tsk    时间: 2014-3-9 13:50
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,所以更多的是实现接口
作者: tangxiaobo1991    时间: 2014-3-10 01:04
本帖最后由 tangxiaobo1991 于 2014-3-10 01:27 编辑

thread类runnable是创建线程的两种方式,分别是:继承和实现。他们的功能和目的都是相同的都是为了创建多线程条提高程序的效率,而且也都是重写拉run方法。但是他们的具体实现过程却不一样。thread是通过继承,然后创建对象后直接调用start()方法的,如下:
class Demo extends Thread
{
public void run(){}
}
class Test
{
  public static void main(String[] args)
{
new Test().start();
}
}

而runnable实现多线程的方法如下:
class Demo implements Runnble
{
public void run(){}
}
class Test
{
  public static void main(String[] args)
{
  new Thread(new Demo()).start();
}
}

以上红色部分是他们创建方式的不同点。同时由于java不支持多继承但却支持多实现,所以实现的方式可以更好的提高程序的拓展性,这也是我们主要用runnable实现的方式创建多线程的原因。




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