线程优于可运行的优势[重复]

Posted

技术标签:

【中文标题】线程优于可运行的优势[重复]【英文标题】:Advantage of Thread over Runnable [duplicate] 【发布时间】:2012-08-14 18:55:13 【问题描述】:

可能重复:Java: “implements Runnable” vs. “extends Thread”

1) 为什么Java语言同时提供Thread和Runnable? 2)线程优于可运行的优点是什么(为什么Java不能只提供可运行的) 3)我们可以做一个可运行的睡眠,给它一个id等吗?

【问题讨论】:

这看起来很像家庭作业,在互联网上已经被回答了大约 10 万次。 @Darin:您提到的帖子中的所有答案都说明了为什么应该使用 runnable 以及它提供的优势。我的问题是为什么Java有Thread,Thread类比Runnable接口有什么优势? 没有 Thread 类就不能启动线程。即使你有一个实现 Runnable 的类,你仍然需要实例化一个线程,或者使用 ExecutorService 来创建你的线程。 @Brian:这不是家庭作业,我没有找到可以对我的问题给出满意解释的答案。 @user892871 - 试试 Oracle 教程。 docs.oracle.com/javase/tutorial/essential/concurrency/…底部的段落简洁地解释了它。这真的归结为 Java 没有多重继承,因此除了在最简单的情况下您希望使用接口来获得灵活性。 【参考方案1】:

1. Thread 是一个类,当你说.start() 时,你创建了一个thread of execution 附加到一个线程类的实例。@987654323调用Runnable的@方法使其执行任务到thread of executionstart()方法快速返回。

2. Runnable 是分配给newly created thread of executiontask

3. 所以没有 Thread 类,你不能运行你的 Runnable。

【讨论】:

【参考方案2】:

1) Thread 是一个类并且包含功能 - 而 runnable 是一个接口,因此只是实现类要遵守的“合同”。由于 Runnable 只是一个接口,您需要实例化一个线程来包含它。而线程已经包含产生线程的能力。

2) 建议使用 Runnable 实现方式,因为如果您扩展 Thread,您将无法扩展其他任何东西(Java 不支持多重继承)。您可以在一个类上有多个接口,因此您可以拥有 Runnable + 许多其他接口,还可以扩展另一个基类

3) 您从 Runnable 的实例化中获取线程并使其休眠 - this.sleep()

【讨论】:

+1。在第 2 点,如果你扩展 Thread,你可能会无意中弄乱线程的核心功能。

以上是关于线程优于可运行的优势[重复]的主要内容,如果未能解决你的问题,请参考以下文章

MVC 优于 MVP 的优势 [重复]

UDP优于TCP的优势?

为啥“实现可运行”优于“扩展线程”? [复制]

使用 UTF-8 优于 UTF-16 有啥优势? [复制]

Java线程与可运行[重复]

线程 notifyAll() [重复]