企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 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`类之间**区别**的全部。 如果您知道更多信息,请在评论部分中添加,然后将其包含在帖子内容中。 学习愉快!