Java中的Runnable和Thread是多线程编程中非常常用的两个概念。虽然它们都可以用来实现线程,但是它们之间却有一些重要的区别。
Runnable是一个接口,只包含了一个run()方法。需要用Thread类的构造函数来创建一个线程对象,并将Runnable对象作为参数传递给Thread的构造函数。
public class MyRunnable implements Runnable { public void run() { // 代码块 } } public static void main(String[] args) { MyRunnable myRunnable = new MyRunnable(); Thread t = new Thread(myRunnable); t.start(); }
Thread是一个类,也可以用来创建线程对象。Thread类实现了Runnable接口,所以当使用Thread类创建线程时,可以通过重写run()方法来实现线程的执行逻辑。
public class MyThread extends Thread { public void run() { // 代码块 } } public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); }
从以上代码可以看出,使用Runnable与使用Thread创建线程的代码结构不同。由于Java不支持多重继承,如果已经继承了某个类,那么只能通过实现Runnable接口来创建线程。
在大部分情况下,使用Runnable会比使用Thread更加灵活。因为当一个类已经继承了其他类时,实现Runnable接口还可以让该类继续拓展扩展其他的接口。
此外,当需要实现线程池或者实现比较复杂的自定义线程逻辑时,使用Runnable也是更好的选择。