为什么在java中有两种使用线程的方法?

时间:2013-06-26 04:59:59

标签: java multithreading inheritance interface

我知道有两种方法可以在java中使用线程:

  1. 实施Runable
  2. 扩展线程
  3. 我也知道实现 Runable 比扩展 Thread 更好。

    但为什么有两种方式 - 为什么不只有一种?

    如果实施 Runnable 是一种更好的方法,为什么还有其他选择呢?

    只有一个选项会出现什么问题?

10 个答案:

答案 0 :(得分:16)

  • extends Thread

    你的线程创建了唯一的对象并与之关联

  • implements Runnable

    它将相同的对象共享给多个线程

需要注意的另一点是,因为你只能在Java中扩展一个类,如果你extends Thread,你就不能扩展另一个类。如果您选择implement Runnable,则可以扩展课程。

答案 1 :(得分:7)

从技术上讲,只有一种方法:实施Runnable。顺便说一句,Thread就是这样做的,所以扩展它就可以满足界面要求。

答案 2 :(得分:3)

我们使用每种类型的线程的另一个原因。

扩展Thread类不会为您提供扩展任何其他类的选项。但是如果你实现Runnable接口,你可以扩展你的类中的其他类..

因此,根据您的设计要求,您可以使用任何一种方法。

答案 3 :(得分:2)

子类化Thread类允许您修改Thread类的其他可覆盖函数,如果您希望这样做。你可能不应该。

此外,子类化Thread类可以产生更易读的代码,有时您的子类中可以拥有自己的自定义API。可以想象诸如DownloadingThread,RenderingThread等类扩展Thread。

答案 4 :(得分:2)

使用Thread作为任务提供了一种创建和运行并行线程的简洁方法

new Thread() {
    public void run() {
        ...
    }
}.start();

答案 5 :(得分:2)

两种方法都有不同的方法。实现Runnable接口不会对线程本身提供任何控制。如果我们扩展线程类,那么派生类不能扩展任何其他基类。

因此,如果用户想要完全控制程序,那么扩展Thread类是更好的选择,如果用户想要扩展其他基类的灵活性,那么实现Runnable接口是不错的选择。

答案 6 :(得分:2)

即使您实现Runnable接口,您也需要创建线程以让您的任务作为线程运行。你实现Runnable的明显优势是

  1. 您可以自由扩展任何其他类
  2. 您可以实施更多接口
  3. 您可以在线程池中使用Runnable实现
  4. 扩展Thread类只是一个选项,因为它在内部实现Runnable,因此您最终间接实现Runnable接口。只是这个类没有最终阻止开发人员扩展它。正如Joshua Bloch在“Effective Java”中提到的那样,通常没有理由扩展Thread吗

答案 7 :(得分:1)

大多数时候,我们使用runnable接口。因为这使我们在结构和功能上更加灵活。 Java允许接口的多重继承。这个概念在软件设计中使用了很多。

顺便说一下,还有另一个名为callable的接口。 可调用类可以返回V类型的值,也可以抛出已检查的异常。

答案 8 :(得分:1)

通过扩展Thread,每个线程都有一个与之关联的唯一对象,而实现Runnable时,许多线程可以共享同一个可运行的实例。

答案 9 :(得分:1)

当我们通过implements runnable创建线程时,我们不会在创建线程期间初始化任何值。 但是当我们扩展Thread类来创建线程时,我们可以使用构造函数的优势初始化一些值,如下所示

public class MyThread extends Thread
{
 int aValue;
 public Mythread(int aValue)
 {
 this.aValue = aValue; 
 }
 ............................
 ............................

}

当我们创建线程时,我们可以初始化为

MyThread t = new MyThread(7);
t.start();

除此之外,由于java不支持多继承,所以我们如果扩展Thread类,那么我们就失去了扩展另一个类的机会。在这种情况下,runnable接口对于创建线程非常有帮助