# Java 中`Runnable`与`Thread`之间的区别

> 原文： [https://howtodoinjava.com/java/multi-threading/java-runnable-vs-thread/](https://howtodoinjava.com/java/multi-threading/java-runnable-vs-thread/)

众所周知，在 Java 语言中，有两种创建线程的方法。 一种使用[`Runnable`](https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html)接口，另一种通过扩展[线程](https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html)类。 让我们确定两种方式之间的区别，即*扩展线程和实现`Runnable`*。

## 1\. 使用`Runnable`接口 vs `Thread`类创建线程

让我们快速检查一下这两种技术的 Java 代码。

#### 1.1 `Runnable`接口

通过实现`Runnable`接口来创建线程的 Java 程序。

```java
public class DemoRunnable implements Runnable {
    public void run() {
    	//Code
    }
}

//start new thread with a "new Thread(new demoRunnable()).start()" call

```

#### 1.2 线程类

通过扩展**线程**类来创建线程的 Java 程序。

```java
public class DemoThread extends Thread {
    public DemoThread() {
    	super("DemoThread");
    }
    public void run() {
    	//Code
    }
}
//start new thread with a "new demoThread().start()" call

```

## 2\. `Runnable`与`Thread`之间的区别

关于哪种更好的方法已经有很多争论。 好吧，我也试图找出答案，下面是我的学习内容。

1.  实现`Runnable`是首选的方法。 在这里，您并没有真正专门化或修改线程的行为。 您只是给线程一些要运行的东西。 这意味着合成是更好的选择。
2.  Java 仅支持单一继承，因此您只能扩展一个类。
3.  实例化一个接口可以使您的代码与线程实现更加清晰地分离。
4.  实现`Runnable`使您的类更加灵活。 如果您扩展`Thread`，那么您执行的操作将始终处于线程状态。 但是，如果您实现了`Runnable`，则不必这样做。 您可以在线程中运行它，或将其传递给某种执行服务，或仅作为任务在单个线程应用程序中传递。
5.  如果您使用的是 JDK 4 或更低版本，则存在错误：

    [http://bugs.java.com/bugdatabase/view_bug.do;jsessionid=5869e03fee226ffffffffc40d4fa881a86e3:WuuT?bug_id=4533087](http://bugs.java.com/bugdatabase/view_bug.do;jsessionid=5869e03fee226ffffffffc40d4fa881a86e3:WuuT?bug_id=4533087)

    它已在 Java 1.5 中修复，但 Sun 并不打算在 1.4 中修复它。

    问题在于，在构造时，`Thread`被添加到内部线程表中的引用列表中。 在`start()`方法完成之前，它不会从该列表中删除。 只要存在该引用，就不会收集垃圾。

这就是 Java 中`Runnable`接口和`Thread`类之间**区别**的全部。 如果您知道更多信息，请在评论部分中添加，然后将其包含在帖子内容中。

学习愉快！