在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