当前位置:   article > 正文

多线程与并发 - Thread和Runnable是什么关系_java中thread和runnable的关系

java中thread和runnable的关系

源码对比

Thread源码

Thread其实是一个类,并且这个类实现了Runnable接口。

Thread利用自身的start方法创建线程,执行实现了的run方法,使其具有多线程的特性

Runnable源码

Runnable其实是一个接口,这个接口很简单,只有一个抽象的run方法,那也就说明这个接口并不具有多线程的特性

实现多线程的方式对比

Thread

创建自己的线程类MyThread,继承Thread,重写run方法

  1. public class Mythread extends Thread {
  2. private String name;
  3. public Mythread(String name) {
  4. this.name = name;
  5. }
  6. @Override
  7. public void run() {
  8. for (int i = 0; i < 5; i++) {
  9. System.out.println("Thread :" + this.name + ",i = " + i);
  10. }
  11. }
  12. }

创建ThreadDemo类,实例化多个MyThread对象,并分别调用start方法创建新线程

  1. public class ThreadDemo {
  2. public static void main(String[] args) {
  3. Mythread m1 = new Mythread("Thread1");
  4. Mythread m2 = new Mythread("Thread2");
  5. Mythread m3 = new Mythread("Thread3");
  6. m1.start();
  7. m2.start();
  8. m3.start();
  9. }
  10. }

运行结果

  1. Thread :Thread3,i = 0
  2. Thread :Thread2,i = 0
  3. Thread :Thread1,i = 0
  4. Thread :Thread1,i = 1
  5. Thread :Thread1,i = 2
  6. Thread :Thread2,i = 1
  7. Thread :Thread3,i = 1
  8. Thread :Thread2,i = 2
  9. Thread :Thread2,i = 3
  10. Thread :Thread1,i = 3
  11. Thread :Thread2,i = 4
  12. Thread :Thread1,i = 4
  13. Thread :Thread3,i = 2
  14. Thread :Thread3,i = 3
  15. Thread :Thread3,i = 4

从执行结果可以看出,3个线程是交互执行的,也就达到了多线程的目的。

Runnable

由于Runnable没有start方法,而Thread有start方法,并且Thread的构造函数中是可以传入Runnable子类实例的,所以我们可以使用Thread类来启动Runnable实现多线程

创建MyRunnable类实现Runnable接口

  1. public class MyRunnable implements Runnable {
  2. private String name;
  3. public MyRunnable(String name) {
  4. this.name = name;
  5. }
  6. @Override
  7. public void run() {
  8. for (int i = 0; i < 5; i++) {
  9. System.out.println("Thread :" + this.name + ",i = " + i);
  10. }
  11. }
  12. }

创建RunnableDemo类,实例化多个MyRunnable对象,再将MyRunnable对象传入Thread构造函数实例化同等数量的Thread对象,并分别调用start方法创建新线程

  1. public class RunnableDemo {
  2. public static void main(String[] args) {
  3. MyRunnable mr1=new MyRunnable("Runnable1");
  4. MyRunnable mr2=new MyRunnable("Runnable2");
  5. MyRunnable mr3=new MyRunnable("Runnable3");
  6. Thread r1=new Thread(mr1);
  7. Thread r2=new Thread(mr2);
  8. Thread r3=new Thread(mr3);
  9. r1.start();
  10. r2.start();
  11. r3.start();
  12. }
  13. }

运行结果

  1. Thread :Runnable1,i = 0
  2. Thread :Runnable2,i = 0
  3. Thread :Runnable3,i = 0
  4. Thread :Runnable2,i = 1
  5. Thread :Runnable1,i = 1
  6. Thread :Runnable2,i = 2
  7. Thread :Runnable3,i = 1
  8. Thread :Runnable2,i = 3
  9. Thread :Runnable2,i = 4
  10. Thread :Runnable1,i = 2
  11. Thread :Runnable1,i = 3
  12. Thread :Runnable1,i = 4
  13. Thread :Runnable3,i = 2
  14. Thread :Runnable3,i = 3
  15. Thread :Runnable3,i = 4

同样,从执行结果可以看出,3个线程是交互执行的,也达到了多线程的目的。

总结

  • Thread是实现了Runnable接口的类,使得run支持多线程(Thread实现了Runnable接口并进行了扩展,而Thread和Runnable的实质是实现的关系)
  • Runnable的多线程实现方式是实现其接口
  • Thread的多线程实现方式是继承其类
  • 因为类的单一继承原则,推荐使用Runnable接口(实现Runnable接口的同时可以实现其它接口或继承其它类,提升可扩展性)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/330278
推荐阅读
相关标签
  

闽ICP备14008679号