📜  在Java中实现 Runnable 和 Extend Thread

📅  最后修改于: 2022-05-13 01:55:00.314000             🧑  作者: Mango

在Java中实现 Runnable 和 Extend Thread

正如Java多线程文章中所讨论的,我们可以通过以下两种方式定义线程:

  • 通过扩展 Thread 类
  • 通过实现 Runnable 接口

在第一种方法中,Our 类始终扩展 Thread 类。没有机会扩展任何其他类。因此,我们缺少继承的好处。在第二种方法中,在实现 Runnable 接口时,我们可以扩展任何其他类。因此,我们能够利用继承的好处。
由于上述原因,建议实现 Runnable 接口的方法,而不是扩展 Thread 类。

扩展 Thread 类和实现 Runnable 接口的显着区别:

  • 当我们扩展 Thread 类时,即使我们需要,我们也不能扩展任何其他类,当我们实现 Runnable 时,我们可以为我们的类节省空间,以便将来或现在扩展任何其他类。
  • 当我们扩展 Thread 类时,我们的每个线程都会创建唯一的对象并与之关联。当我们实现 Runnable 时,它会将同一个对象共享给多个线程。

让我们看一下以下程序以更好地理解:

// Java program to illustrate defining Thread
// by extending Thread class
  
// Here we cant extends any other class
class Test extends Thread 
{
    public void run()
    {
        System.out.println("Run method executed by child Thread");
    }
    public static void main(String[] args)
    {
        Test t = new Test();
        t.start();
        System.out.println("Main method executed by main thread");
    }
}

输出:

Main method executed by main thread
Run method executed by child Thread
// Java program to illustrate defining Thread
// by implements Runnable interface
class Geeks {
    public static void m1()
    {
        System.out.println("Hello Visitors");
    }
}
  
// Here we can extends any other class
class Test extends Geeks implements Runnable {
    public void run()
    {
        System.out.println("Run method executed by child Thread");
    }
    public static void main(String[] args)
    {
        Test t = new Test();
        t.m1();
        Thread t1 = new Thread(t);
        t1.start();
        System.out.println("Main method executed by main thread");
    }
}

输出:

Hello Visitors
Main method executed by main thread
Run method executed by child Thread

注意:在多线程的情况下,我们无法预测输出的确切顺序,因为它会因系统或 JVM 而异。

参考: https://stackoverflow.com/questions/15471432/why-implements-runnable-is-preferred-over-extends-thread