java中为什么要用线程_关于多线程:为什么在java中有两种使用线程的方法?

本问题已经有最佳答案,请猛点这里访问。

我知道在Java中使用线程有两种方法:

实现可运行

延伸螺纹

我也知道实现runable比扩展线程要好。

但为什么有两种方法——为什么不止一种?

如果实现可运行性是一种更好的方法,为什么还有其他选择?

只有一个选择会有什么问题?

stackoverflow.com/questions/541487/…检查这个。

这是一篇很好的相关文章…

extends Thread号:

您的线程创建唯一的对象并与之关联

implements Runnable号:

它与多个线程共享同一对象

还有一点要注意,因为在Java中只能扩展一个类,如果EDCOX1为4,则不能扩展另一个类。如果选择implement Runnable,则可以扩展类。

从技术上讲,只有一种方法:实现Runnable。顺便说一句,Thread就是这样做的,所以扩展它就可以满足接口需求。

我们使用每种线程的另一个原因。

扩展Thread类不会给您提供扩展任何其他类的选项。但是,如果实现Runnable接口,您可以扩展类中的其他类。

因此,根据您的设计要求,您可以使用任何一种方法。

即使您实现了可运行的接口,您也需要创建线程来让您的任务作为线程运行。实现可运行性的明显优势是

你有权扩展任何其他等级

您可以实现更多的接口

可以在线程池中使用可运行的实现

扩展线程类只是一个选项,因为它在内部实现了可运行的,所以您最终间接实现了可运行的接口。只是这个类并不是为了防止开发人员扩展它而最终确定的。正如Joshua Bloch在"有效Java"中提到的,通常不需要扩展线程的理由。

两种方法都有不同的方法。实现可运行接口并不能给线程本身任何控制权。如果我们扩展线程类,那么派生类就不能扩展任何其他的基类。

因此,如果用户希望完全控制程序,那么线程类的扩展是更好的选择;如果用户希望扩展其他基类的灵活性,那么实现可运行接口是很好的选择。

将线程用作任务提供了创建和运行并行线程的简洁方法

new Thread() {

public void run() {

...

}

}.start();

子类化Thread类允许您修改Thread类的其他可重写函数,如果您希望这样做的话。你可能不应该。

此外,子类化线程类有时会产生更可读的代码,在子类中,您可以拥有自己的自定义API。可以想象类,如downloadingthread、renderingthread等扩展线程。

当我们通过实现runnable创建线程时,在线程创建期间不会初始化任何值。但是,当我们扩展线程类以创建线程时,如果需要,我们可以使用构造函数的优点初始化一些值,如下所示

public class MyThread extends Thread

{

int aValue;

public Mythread(int aValue)

{

this.aValue = aValue;

}

............................

............................

}

当我们创建线程时,我们可以如下初始化

MyThread t = new MyThread(7);

t.start();

因为Java不支持多重继承,所以如果我们扩展了线程类,那么我们就失去了扩展另一个类的机会。因此,在这个场景中,可运行接口对创建线程非常有帮助。

谢谢。。征求意见。这也是这个问题的重要术语。

-1您可以在实现可运行的类中初始化变量。这是一篇文章和一个例子。它还值得阅读,因为它解释了"实现可运行的"和"扩展线程"的好处和区别。

通过扩展线程,每个线程都有一个与之相关联的唯一对象,而实现可运行,许多线程可以共享同一个可运行实例。

大多数时候,我们使用可运行的接口。因为这使得我们在结构和功能上更加灵活。Java允许对接口进行多重继承。这个概念在软件设计中被大量使用。

顺便说一下,还有另一个称为Callable的接口。可调用类可以返回类型v中的值,也可以抛出检查过的异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值