Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我应该使用Runnable而不是Thread?_Java - Fatal编程技术网

Java 为什么我应该使用Runnable而不是Thread?

Java 为什么我应该使用Runnable而不是Thread?,java,Java,我只是学习了关于线的理论。还有线程和可运行线程 class A extends Thread{ public void run(){ while(true) { System.out.println("Hi"); } } } Thread很适合使用富API,那么为什么我要使用Runnable而不是Thread呢 谢谢。1。Java不支持多重继承,这意味着您只能

我只是学习了关于线的理论。还有线程和可运行线程

class A extends Thread{
    public void run(){
            while(true) {
                System.out.println("Hi");
            }           
        }
    }

Thread很适合使用富API,那么为什么我要使用Runnable而不是Thread呢


谢谢。

1。Java不支持多重继承,这意味着您只能扩展一个Java类,因此一旦扩展了
线程
类,您就失去了在Java中扩展(继承)另一个类的机会

2.在OOP中,扩展类通常意味着添加新功能、修改或改进行为。如果您没有对
线程
进行任何修改,请改用
可运行
接口


3.实现
Runnable
使类更加灵活(可以实现多个接口)。

最大的优点之一是:不必在新线程上运行
Runnable

有一天,您可能会决定不在新线程上运行它,而是直接(在当前线程上)或在线程池上运行它-然后您可以将
新线程(runnable).start()
更改为
线程池.submit(runnable)
runnable.run()
-并且更改只影响一个位置


另外,如果您将
可运行的
挂起,它不会浪费资源-它不会计入线程限制(如果有),也不会为堆栈保留空间。假设您希望一次完成一个任务—当然,您可以有一个
队列
,然后在前一个线程完成时启动每个线程,但这样做会浪费大量内存与非运行线程。如果您使用的是
Runnable
s队列,那么除了在实际运行时,您不会使用太多内存。

在什么情况下,您希望实现Runnable并同时扩展其他内容?(超类是一个不能扩展线程本身的类)谢谢你的回复。想想我们在课堂上需要JFrame的质量,然后我们必须扩展JFrame,才能得到它。在同一个类中,如果我们需要获得线程(并发进程)质量,我们必须实现Runnable。因为我们不能从线程扩展(我们已经继承了一个类)。希望你能理解@immibis:)@DhanukaLakshan大多数人都建议不要扩展JFrame,原因与不应该扩展线程的原因相同。所以你可以决定这些是否是好的理由:)是的!你说得对。感谢@immibis指出这一点。我会记住这一点。(ELI5版本:一个线程是“一个工作者”,一个可运行线程是“一些工作”。当然,你可以让一群工作者每个人只做一件事,但这是低效的,不是吗?)
class B implements Runnable{
    public void run(){
        System.out.println("Hi");
    }
}