Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.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中有两种使用线程的方法?_Java_Multithreading_Inheritance_Interface - Fatal编程技术网

为什么java中有两种使用线程的方法?

为什么java中有两种使用线程的方法?,java,multithreading,inheritance,interface,Java,Multithreading,Inheritance,Interface,我知道在java中使用线程有两种方法: 实现可运行 延长线 我还知道实现Runable比扩展线程要好 但是为什么有两种方法——为什么不是只有一种 如果实现Runnable是一种更好的方法,为什么还有其他选择 只有一个选项会有什么问题?从技术上讲,只有一种方法:实现Runnable线程,顺便说一句,就是这样做的,因此扩展它只需满足接口要求。子类化线程类允许您修改线程类的其他可重写函数,如果您希望这样做的话。也许你不应该 此外,子类化Thread类有时会产生可读性更强的代码,在子类中您可以拥有自己的

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

  • 实现可运行
  • 延长线
  • 我还知道实现Runable比扩展线程要好

    但是为什么有两种方法——为什么不是只有一种

    如果实现Runnable是一种更好的方法,为什么还有其他选择


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

    从技术上讲,只有一种方法:实现
    Runnable
    <代码>线程,顺便说一句,就是这样做的,因此扩展它只需满足接口要求。

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

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

    • 扩展线程

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

    • 实现可运行的

      它将同一对象共享给多个线程


    另外需要注意的是,由于在Java中只能扩展一个类,如果
    扩展Thread
    ,就不能扩展另一个类。如果您选择
    实现Runnable
    ,那么您可以扩展类。

    这是我们使用每种类型线程的另一个原因

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


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

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

    顺便说一下,还有另一个接口叫做callable。
    可调用类可以返回V类型的值,也可能抛出已检查的异常。

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

    new Thread() {
        public void run() {
            ...
        }
    }.start();
    

    两种方法都有不同的方法。实现Runnable接口不会对线程本身提供任何控制。若我们扩展线程类,那个么派生类就不能扩展任何其他基类


    所以,若用户想要完全控制程序,那个么扩展线程类是更好的选择,若用户想要扩展其他基类的灵活性,那个么实现可运行接口是一个好选择。

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

  • 你可以自由扩展其他课程
  • 您可以实现更多接口
  • 您可以在线程池中使用可运行的实现

  • 扩展Thread类只是一个选项,因为它在内部实现Runnable,所以最终间接实现Runnable接口。只是这个类并不是最终的,以防止开发人员扩展它。正如Joshua Bloch在《有效Java》中提到的那样,通常没有理由通过扩展线程来扩展线程,每个线程都有一个与之关联的唯一对象,而实现Runnable,许多线程可以共享同一个可运行实例。

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

    public class MyThread extends Thread
    {
     int aValue;
     public Mythread(int aValue)
     {
     this.aValue = aValue; 
     }
     ............................
     ............................
    
    }
    
    当我们创建线程时,我们可以如下初始化

    MyThread t = new MyThread(7);
    t.start();
    

    除此之外,由于java不支持多重继承,所以如果扩展线程类,那么我们就失去了扩展另一个类的机会。因此在这个场景中,runnable接口对创建线程非常有帮助。请检查此项。谢谢。。征求意见。这也是问题的一个重要术语。-1您完全可以在实现Runnable的类中初始化变量。下面是一个例子。它还解释了“实现可运行”和“扩展线程”的好处和区别,值得一读。