java-创建线程的两种方式对比

在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程, 以下是创建多个现场的两种方式:

一.通过继承Thread类,重写Threadrun()方法,将线程运行的逻辑放在其中.

  • 实现MyThread2类 继承 Thread
      class MyThread2 extends Thread{
          private int ticket=5;
          private String name;
          public MyThread2(String name){
              this.name = name;
          }
          public void run(){
              for(int i=0; i<500; i++){
                  if (this.ticket>0){
                      System.out.println(this.name+"卖票---->"+(this.ticket--));
                  }
              }
          }
      }
    
    • 创建三个 MyThread2 线程, 并运行 (三个线程, 分别执行卖出5张票的任务或资源), 最后结果:最终共计卖出15张票
      @Test
      public void testD() {
          MyThread2 mt1 = new MyThread2("一号窗口");
          MyThread2 mt2 = new MyThread2("二号窗口");
          MyThread2 mt3 = new MyThread2("三号窗口");
          mt1.start();
          mt2.start();
          mt3.start();
      }
    
    • 运行结果为:
      一号窗口卖票---->5
      一号窗口卖票---->4
      一号窗口卖票---->3
      一号窗口卖票---->2
      一号窗口卖票---->1
      二号窗口卖票---->5
      二号窗口卖票---->4
      二号窗口卖票---->3
      二号窗口卖票---->2
      二号窗口卖票---->1
      三号窗口卖票---->5
      三号窗口卖票---->4
      三号窗口卖票---->3
      三号窗口卖票---->2
    
  • 任务分配如图所示:


    java-创建线程的两种方式对比_第1张图片
    image.png

二.通过实现Runnable接口,实例化Thread类.

  • MyThread3 类实现 Runnable 接口
    class MyThread3 implements Runnable{
      private int ticket=5;
      private String name;
      @Override
      public void run() {
          for (int i=0; i<500; i++) {
              if (this.ticket>0){
                  System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));
              }
          }
      }
  }
  • 一个卖出5张票的任务MyThread3, 创建三个线程 Thread共同执行该任务(也就是共享MyThread3这一个资源), 最终结果: 卖出总计卖出5张票.
      @Test
      public void testE() {
              MyThread3 mt = new MyThread3();
              Thread thread1 = new Thread(mt,"一号窗口");
              Thread thread2 = new Thread(mt,"二号窗口");
              Thread thread3 = new Thread(mt,"三号窗口");
              thread1.start();
              thread2.start();
              thread3.start();
          }
    
      }
    
  • 运行结果:
    一号窗口卖票---->5
    一号窗口卖票---->4
    一号窗口卖票---->3
    一号窗口卖票---->2
    一号窗口卖票---->1
    
  • 任务分配如图所示:


    java-创建线程的两种方式对比_第2张图片
    image.png

三. 总结:

实现Runnable接口比继承Thread类来实现多线程有如下明显优点:

  1. 适合多个相同程序代码使用共同资源;
  2. 避免由单继承局限带来的影响;
  3. 所以在实际开发过程中一般都是使用实现Runnable接口来实现多线程的.

参考文章:

  • java多线程Thread与Runnable的区别与使用深入理解
  • Runnable和Thread的区别

你可能感兴趣的:(java-创建线程的两种方式对比)