原文: 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
类之间区别的全部。 如果您知道更多信息,请在评论部分中添加,然后将其包含在帖子内容中。
学习愉快!