使用Thread类和Runnable接口实现多线程,二者有何本质区别?

2026-04-11 10:081阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计663个文字,预计阅读时间需要3分钟。

使用Thread类和Runnable接口实现多线程,二者有何本质区别?

使用Thread类和Runnable接口实现多线程的区别:

- Thread类:Thread类是Java中实现多线程的一种方式,它继承自Object类,并实现了Runnable接口。使用Thread类可以实现更丰富的线程功能,如设置线程优先级、中断线程等。

- Runnable接口:Runnable接口是一个标记接口,用于定义线程的运行逻辑。实现Runnable接口的类可以创建一个线程,但无法直接使用Thread类的其他功能。

两种实现方式的步骤:

1. 创建一个实现了Runnable接口的类,并重写run()方法定义线程的执行逻辑。

2.创建Thread类的实例,并将实现了Runnable接口的类的实例作为参数传递给Thread类的构造函数。

3.调用Thread类的start()方法启动线程。

示例代码:

java

public class ThreadDemo { public static void main(String[] args) { for (int i=0; i <5; i++) { new Thread(new Runnable() { @Override public void run() { System.out.println(Using Runnable interface); } }).start(); }

for (int i=0; i <5; i++) { new Thread(new ThreadDemo()) { @Override public void run() { System.out.println(Using Thread class); } }.start(); } }}

使用Thread类和Runnable接口实现多线程,二者有何本质区别?

使用Thread类和Runnable接口实现多线程的区别 使用Thread类和Runnable接口实现多线程的区别

先看两种实现方式的步骤:

public class ThreadDemo{ public static void main(String[] args) { for (int i = 0; i < 5; i++) { //创建并启动由继承Thread类创建的线程 new Thread(new MyThread(),"Thread"+i).start(); //创建并启动由实现Runnable接口创建的线程 new Thread(new Runner(),"Thread"+i).start(); } } } //继承Thread类 class MyThread extends Thread{ //重写run方法 @Override public void run() { System.out.println(Thread.currentThread().getName()+"由继承Thread创建"); } } //实现Runnable接口 class Runner implements Runnable{ //实现run方法 @Override public void run() { System.out.println(Thread.currentThread().getName()+"有实现Runnable接口创建"); } }

从上面代码可以看出,当使用Runnable接口创建多线程时,需要将实现类作为参数出入到Thread实例对象中,通过调用Thread对象的start方法进行启动。我们来看一下Thread的源码

//Thread类继承了Runnable类 public class Thread implements Runnable {} //Thread的构造函数调用了init方法 public Thread(Runnable target) { init(null, target, "Thread-" + nextThreadNum(), 0); } //init调用了静态方法init private void init(ThreadGroup g, Runnable target, String name, long stackSize) { init(g, target, name, stackSize, null, true); } //再看静态方法init private void init(ThreadGroup g, Runnable target, String name, long stackSize, AccessControlContext acc, boolean inheritThreadLocals) { ... //私有Runnable实例 this.target = target; ... } //再看一下Runnable方法 @Override public void run() { if (target != null) { target.run(); } }

从以上追踪源码过程可以看出,Thread类实现了 Runnable 接口,而继承Thread类重写 run 方法本质就是实现Runnable接口的 run 方法。

通过以上分析,总结使用 Thread 类和 Runnable 接口的区别:

  1. 使用继承 Thread 类实现多线程相比于 Runnable 更加简单,使用 Runnable 接口需要使用 Thread进行再次封装。
  2. 由于 Java 中不支持多继承,一个类继承了 Thread 类后无法再继承其他类,因此使用 Runnable 接口实现多线程有更好的灵活性。

除了以上两种多线程实现方式,还可以使用 Callable 接口实现,我写了一篇关于 Callable 和 Runnable 接口实现多线程对比的总结:

使用Runnable和Callable接口实现多线程的区别

本文共计663个文字,预计阅读时间需要3分钟。

使用Thread类和Runnable接口实现多线程,二者有何本质区别?

使用Thread类和Runnable接口实现多线程的区别:

- Thread类:Thread类是Java中实现多线程的一种方式,它继承自Object类,并实现了Runnable接口。使用Thread类可以实现更丰富的线程功能,如设置线程优先级、中断线程等。

- Runnable接口:Runnable接口是一个标记接口,用于定义线程的运行逻辑。实现Runnable接口的类可以创建一个线程,但无法直接使用Thread类的其他功能。

两种实现方式的步骤:

1. 创建一个实现了Runnable接口的类,并重写run()方法定义线程的执行逻辑。

2.创建Thread类的实例,并将实现了Runnable接口的类的实例作为参数传递给Thread类的构造函数。

3.调用Thread类的start()方法启动线程。

示例代码:

java

public class ThreadDemo { public static void main(String[] args) { for (int i=0; i <5; i++) { new Thread(new Runnable() { @Override public void run() { System.out.println(Using Runnable interface); } }).start(); }

for (int i=0; i <5; i++) { new Thread(new ThreadDemo()) { @Override public void run() { System.out.println(Using Thread class); } }.start(); } }}

使用Thread类和Runnable接口实现多线程,二者有何本质区别?

使用Thread类和Runnable接口实现多线程的区别 使用Thread类和Runnable接口实现多线程的区别

先看两种实现方式的步骤:

public class ThreadDemo{ public static void main(String[] args) { for (int i = 0; i < 5; i++) { //创建并启动由继承Thread类创建的线程 new Thread(new MyThread(),"Thread"+i).start(); //创建并启动由实现Runnable接口创建的线程 new Thread(new Runner(),"Thread"+i).start(); } } } //继承Thread类 class MyThread extends Thread{ //重写run方法 @Override public void run() { System.out.println(Thread.currentThread().getName()+"由继承Thread创建"); } } //实现Runnable接口 class Runner implements Runnable{ //实现run方法 @Override public void run() { System.out.println(Thread.currentThread().getName()+"有实现Runnable接口创建"); } }

从上面代码可以看出,当使用Runnable接口创建多线程时,需要将实现类作为参数出入到Thread实例对象中,通过调用Thread对象的start方法进行启动。我们来看一下Thread的源码

//Thread类继承了Runnable类 public class Thread implements Runnable {} //Thread的构造函数调用了init方法 public Thread(Runnable target) { init(null, target, "Thread-" + nextThreadNum(), 0); } //init调用了静态方法init private void init(ThreadGroup g, Runnable target, String name, long stackSize) { init(g, target, name, stackSize, null, true); } //再看静态方法init private void init(ThreadGroup g, Runnable target, String name, long stackSize, AccessControlContext acc, boolean inheritThreadLocals) { ... //私有Runnable实例 this.target = target; ... } //再看一下Runnable方法 @Override public void run() { if (target != null) { target.run(); } }

从以上追踪源码过程可以看出,Thread类实现了 Runnable 接口,而继承Thread类重写 run 方法本质就是实现Runnable接口的 run 方法。

通过以上分析,总结使用 Thread 类和 Runnable 接口的区别:

  1. 使用继承 Thread 类实现多线程相比于 Runnable 更加简单,使用 Runnable 接口需要使用 Thread进行再次封装。
  2. 由于 Java 中不支持多继承,一个类继承了 Thread 类后无法再继承其他类,因此使用 Runnable 接口实现多线程有更好的灵活性。

除了以上两种多线程实现方式,还可以使用 Callable 接口实现,我写了一篇关于 Callable 和 Runnable 接口实现多线程对比的总结:

使用Runnable和Callable接口实现多线程的区别