线程相对于Runnable的优势

5

可能重复:
Java:实现Runnable vs 继承Thread

  1. 为什么Java语言同时提供Thread和Runnable?
  2. 相比于Runnable,线程的优点是什么(为什么Java不能只提供一个runnable)?
  3. 我们可以让一个Runnable睡眠、给它一个ID等吗?

3
这似乎很像作业题,并且已经在互联网上被回答了大约十万次。 - Brian Roach
2
@Darin:你提到的帖子中所有答案都说明了为什么应该使用Runnable以及它提供的优势。我的问题是,为什么Java需要Thread类,Thread类相对于Runnable接口有哪些优势? - user892871
1
你不能在没有Thread类的情况下启动线程。即使你有一个实现了Runnable接口的类,你仍然需要实例化一个线程,或者使用ExecutorService来创建你的线程。 - Dan
@Brian:这不是作业,我没有找到一个令人满意的解释来回答我的问题。 - user892871
@user892871 - 请尝试使用Oracle教程。http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html 底部的段落简洁地解释了它。实际上,这归结为Java没有多重继承,因此除非在最简单的情况下,您要使用接口来获得灵活性。 - Brian Roach
2个回答

11
  1. Thread是一个类,当你调用start()方法时,你创建了一个被附加到Thread实例的执行线程,并且会调用Runnable的run()方法,使它在执行线程上执行任务,而start()方法很快返回。

  2. Runnable是分配给新创建的执行线程任务

  3. 因此,如果没有Thread类,你就无法运行你的Runnable。


4
  1. Thread是一个类,包含功能 - 而Runnable是一个接口,因此只是一个实现类必须遵守的“契约”。由于Runnable只是一个接口,所以您需要实例化一个线程来包含它。而线程已经包含了生成线程的能力。
  1. 实现Runnable是建议的方式,因为如果您扩展Thread,则无法扩展其他任何内容(Java不支持多重继承)。您可以在类上拥有多个接口,因此您可以拥有Runnable +许多其他接口,并扩展另一个基类

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


在第二点上,如果您扩展Thread,还可能无意中破坏线程的核心功能。 - Nathan Hughes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接