原文: https://howtodoinjava.com/java/multi-threading/java-runnable-vs-thread/

众所周知,在 Java 语言中,有两种创建线程的方法。 一种使用Runnable接口,另一种通过扩展线程类。 让我们确定两种方式之间的区别,即扩展线程和实现Runnable

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

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

1.1 Runnable接口

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

  1. public class DemoRunnable implements Runnable {
  2. public void run() {
  3. //Code
  4. }
  5. }
  6. //start new thread with a "new Thread(new demoRunnable()).start()" call

1.2 线程类

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

  1. public class DemoThread extends Thread {
  2. public DemoThread() {
  3. super("DemoThread");
  4. }
  5. public void run() {
  6. //Code
  7. }
  8. }
  9. //start new thread with a "new demoThread().start()" call

2. RunnableThread之间的区别

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

  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
    它已在 Java 1.5 中修复,但 Sun 并不打算在 1.4 中修复它。
    问题在于,在构造时,Thread被添加到内部线程表中的引用列表中。 在start()方法完成之前,它不会从该列表中删除。 只要存在该引用,就不会收集垃圾。

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

学习愉快!