原文: https://howtodoinjava.com/java/multi-threading/java-runnable-vs-thread/
众所周知,在 Java 语言中,有两种创建线程的方法。 一种使用Runnable接口,另一种通过扩展线程类。 让我们确定两种方式之间的区别,即扩展线程和实现Runnable。
1. 使用Runnable接口 vs Thread类创建线程
让我们快速检查一下这两种技术的 Java 代码。
1.1 Runnable接口
通过实现Runnable接口来创建线程的 Java 程序。
public class DemoRunnable implements Runnable {public void run() {//Code}}//start new thread with a "new Thread(new demoRunnable()).start()" call
1.2 线程类
通过扩展线程类来创建线程的 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之间的区别
关于哪种更好的方法已经有很多争论。 好吧,我也试图找出答案,下面是我的学习内容。
实现
Runnable是首选的方法。 在这里,您并没有真正专门化或修改线程的行为。 您只是给线程一些要运行的东西。 这意味着合成是更好的选择。Java 仅支持单一继承,因此您只能扩展一个类。
实例化一个接口可以使您的代码与线程实现更加清晰地分离。
实现
Runnable使您的类更加灵活。 如果您扩展Thread,那么您执行的操作将始终处于线程状态。 但是,如果您实现了Runnable,则不必这样做。 您可以在线程中运行它,或将其传递给某种执行服务,或仅作为任务在单个线程应用程序中传递。如果您使用的是 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类之间区别的全部。 如果您知道更多信息,请在评论部分中添加,然后将其包含在帖子内容中。
学习愉快!
