Runnable
和Thread
都是Java多线程编程中的核心概念,它们之间存在以下主要差异:
Runnable
是一个接口,而Thread
是一个类。这意味着我们可以通过实现Runnable
接口来创建线程,或者直接继承Thread
类并重写其方法。Runnable
只包含一个run
方法,这是线程的主体部分。当我们想要创建一个新线程时,需要实例化一个Runnable
对象并将其传入Thread
的构造函数中。相比之下,Thread
类可以直接调用其run
方法。- 从语法和结构上看,使用
Runnable
接口的方式更为灵活和推荐,因为Java不支持多重继承,但可以实现多个接口。通过实现Runnable
接口并传递给Thread
类,我们可以更容易地共享和管理线程代码。 - 在实际应用中,当一个类已经继承了另一个类(例如自定义的视图类或其他框架中的类),那么这个类就不能再继承
Thread
类。但是,它可以实现Runnable
接口并通过其他方式创建线程。
Runnable
和Thread
都需要调用start()
方法来启动线程。
对于Runnable
接口,我们需要创建一个实现该接口的类,并重写其run()
方法。然后,我们可以创建一个新的Thread
对象,将实现了Runnable
接口的类的实例作为参数传递给它,最后调用start()
方法来启动线程。
class MyRunnable implements Runnable {
@Override
public void run() {
// 线程主体部分的代码
}
}
public class Main {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start(); // 启动线程
}
}
对于Thread
类,我们可以直接继承它并重写其run()
方法。然后,我们可以创建一个新的Thread
对象(即子类的对象),最后调用start()
方法来启动线程。示例代码如下:
class MyThread extends Thread {
@Override
public void run() {
// 线程主体部分的代码
}
}
public class Main {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start(); // 启动线程
}
}