Why should I use Runnable instead of Thread?
我只是学习了关于线的理论。还有线程和可运行的。
1 2 3 4 5 6 7
| class A extends Thread{
public void run (){
while(true) {
System. out. println("Hi");
}
}
} |
1 2 3 4 5
| class B implements Runnable{
public void run (){
System. out. println("Hi");
}
} |
号
线程对于富API很好,所以为什么我要使用runnable而不是线程?
谢谢。
1。Java不支持多重继承,这意味着只能扩展一个Java类,因此一旦扩展了EDCOX1,0类,就失去了机会,不能在Java中扩展(继承)另一个类。
2。在OOP中,扩展类通常意味着添加新功能、修改或改进行为。如果您没有对Thread进行任何修改,那么使用Runnable接口。
三。实现Runnable使类更加灵活(您可以实现多个接口)。
- 在什么情况下,您希望实现可运行并同时扩展其他内容?(超类是无法扩展线程本身的类)
- 谢谢你的回复。只要认为我们需要类中的JFrame质量,然后我们必须扩展JFrame,才能得到它。在同一个类中,如果我们需要获得线程(并发进程)的质量,我们必须实现可运行的。因为我们不能从线程扩展(我们已经继承了一个类)。希望你能理解。@不相容性:)
- @Dhanukalakshan大多数人建议不要扩展JFrame,原因与不应该扩展线程的原因相同。所以你可以决定这些是否是好的理由:)
- 对!你说得对。感谢@immibis指出这一点。我会记住的。
其中一个最大的优点是:您不必在新线程上运行Runnable。
有一天,您可能会决定不在新线程上运行它,而是直接(在当前线程上)运行它,或者在线程池上运行它,然后您可以将new Thread(runnable).start()更改为threadPool.submit(runnable)或runnable.run(),并且更改只影响一个地方。
另外,如果您让一个Runnable挂在旁边,它不会浪费资源——它不计入线程限制(如果有线程限制),也不会为堆栈保留空间。假设你想一次做一件事——当然,你可以有一个Queue,然后在前一个线程完成时启动每个线程,但是在没有运行的线程上浪费了大量的内存。如果您使用的是Runnable的队列,那么除了它们实际运行时,您不会使用太多的内存。
- (ELI5版本:线程是"worker",可运行的是"some work"。当然,你可以让一群工人每人只做一件事,但这是低效的,不是吗?)