美文网首页工作生活
java-创建线程的两种方式对比

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

作者: liangxifeng833 | 来源:发表于2019-08-20 11:41 被阅读0次

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

    一.通过继承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
      
    • 任务分配如图所示:


      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
      
    • 任务分配如图所示:


      image.png

    三. 总结:

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

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

    参考文章:

    相关文章

      网友评论

        本文标题:java-创建线程的两种方式对比

        本文链接:https://www.haomeiwen.com/subject/vrvzcctx.html