我知道有两种方法可以在java中使用线程:
我也知道实现 Runable 比扩展 Thread 更好。
但为什么有两种方式 - 为什么不只有一种?
如果实施 Runnable 是一种更好的方法,为什么还有其他选择呢?
只有一个选项会出现什么问题?
答案 0 :(得分:16)
extends Thread
:
你的线程创建了唯一的对象并与之关联
implements Runnable
:
它将相同的对象共享给多个线程
需要注意的另一点是,因为你只能在Java中扩展一个类,如果你extends Thread
,你就不能扩展另一个类。如果您选择implement Runnable
,则可以扩展课程。
答案 1 :(得分:7)
从技术上讲,只有一种方法:实施Runnable
。顺便说一句,Thread
就是这样做的,所以扩展它就可以满足界面要求。
答案 2 :(得分:3)
我们使用每种类型的线程的另一个原因。
扩展Thread
类不会为您提供扩展任何其他类的选项。但是如果你实现Runnable
接口,你可以扩展你的类中的其他类..
因此,根据您的设计要求,您可以使用任何一种方法。
答案 3 :(得分:2)
子类化Thread
类允许您修改Thread
类的其他可覆盖函数,如果您希望这样做。你可能不应该。
此外,子类化Thread类可以产生更易读的代码,有时您的子类中可以拥有自己的自定义API。可以想象诸如DownloadingThread,RenderingThread等类扩展Thread。
答案 4 :(得分:2)
使用Thread作为任务提供了一种创建和运行并行线程的简洁方法
new Thread() {
public void run() {
...
}
}.start();
答案 5 :(得分:2)
两种方法都有不同的方法。实现Runnable接口不会对线程本身提供任何控制。如果我们扩展线程类,那么派生类不能扩展任何其他基类。
因此,如果用户想要完全控制程序,那么扩展Thread类是更好的选择,如果用户想要扩展其他基类的灵活性,那么实现Runnable接口是不错的选择。
答案 6 :(得分:2)
即使您实现Runnable接口,您也需要创建线程以让您的任务作为线程运行。你实现Runnable的明显优势是
扩展Thread类只是一个选项,因为它在内部实现Runnable,因此您最终间接实现Runnable接口。只是这个类没有最终阻止开发人员扩展它。正如Joshua Bloch在“Effective Java”中提到的那样,通常没有理由扩展Thread吗
答案 7 :(得分:1)
大多数时候,我们使用runnable接口。因为这使我们在结构和功能上更加灵活。 Java允许接口的多重继承。这个概念在软件设计中使用了很多。
顺便说一下,还有另一个名为callable的接口。 可调用类可以返回V类型的值,也可以抛出已检查的异常。
答案 8 :(得分:1)
通过扩展Thread,每个线程都有一个与之关联的唯一对象,而实现Runnable时,许多线程可以共享同一个可运行的实例。
答案 9 :(得分:1)
当我们通过implements runnable创建线程时,我们不会在创建线程期间初始化任何值。 但是当我们扩展Thread类来创建线程时,我们可以使用构造函数的优势初始化一些值,如下所示
public class MyThread extends Thread
{
int aValue;
public Mythread(int aValue)
{
this.aValue = aValue;
}
............................
............................
}
当我们创建线程时,我们可以初始化为
MyThread t = new MyThread(7);
t.start();
除此之外,由于java不支持多继承,所以我们如果扩展Thread类,那么我们就失去了扩展另一个类的机会。在这种情况下,runnable接口对于创建线程非常有帮助