zoukankan      html  css  js  c++  java
  • Thread与Runable

    当我们继承Thread的时候可以看出。

    调用run()与start()来启动多线程是有区别。

    如下我们开启多线程时

    MyThread  mt1 = new MyThread(“线程A”);

    MyThread  mt1 = new MyThread(“线程A”);

    mt1.run():

    mt2.run():

    发现以上的程序是先执行完mt1后执行mt2,并没有交错运行。也就是说此次线程并没有启动,还是属于顺序式的执行方式。那么我们以star()来启动线程回事如何?

    MyThread  mt1 = new MyThread(“线程A”);

    MyThread  mt1 = new MyThread(“线程A”);

    mt1.start():

    mt2.start():

    结果中可以发现两个线程是交错运行的。哪个线程先抢到了CPU资源,哪个线程就可以运行。所以程序每次运行输出的顺序式不一样的。单虽然调用的是start()但是最终还是调用的是run()方法。

    以下是Start()部分源代码:

    当我们调用多次start()时会产生错误。这也是避免了重复调用start()。

    还有Thread本身实现了Runable从源代码中可以看出:

    如果一个类只能继承Thread类才能实现多线程,则必定受到单线程的局限性。

    所以一般来说我们会用Runable接口来完成多线程操作。

    那么问题是实现Runable接口的类是没有start()方法的。

    Thread提供以构造函数来传递Runable对象。

    Public Thread(Runable target);

    Public Thread(Runable target,String name);

    那么我们可以通过Thread启动实现Runable接口的类了。

    new Thread(MyRunable).start();

    Thread与Runable的重要区别之一是:

    Thread不适合于多线程共享资源。

    Runable可以方便地实现资源的共享。

    class MyThread extends Thread{
    private int ticket = 5;
      
    public void run(){     for(int i=0;i<5;i++){     if(ticket>0)     System.out.println(“卖票:ticket = “ + ticket--);       }     }   }
    public class ThreadDemo{   public static void main(String args[]){     MyThread mt1 = new MyThread();     MyThread mt1 = new MyThread();     MyThread mt1 = new MyThread();     mt1.start();     mt2.start();     mt3.start();   } }

    运行结果为依次重复54321三次:

    class MyThread implements Runable{
    
    private int ticket = 5;
    
      public void run(){
        for(int i=0;i<5;i++){
            if(ticket>0)
               System.out.println(“卖票:ticket = “ + ticket--);
          }
        }
      }
    
    public class ThreadDemo{
      public static void main(String args[]){
        MyThread runable = new MyThread();
        new MyThread(runable).start();
        new MyThread(runable).start();
        new MyThread(runable).start();   
      }
    }

    运行结果你会发现只会输出一次54321:

     简单介绍一下线程状态:

  • 相关阅读:
    测试管理工具
    测试用例--zy
    测试计划和测试用例
    测试用例
    软件测试基础
    异步任务 ---- django-celery
    图片验证码接口
    测试作业
    数据库原理
    HTTPS原理
  • 原文地址:https://www.cnblogs.com/hongguang-kim/p/5620523.html
Copyright © 2011-2022 走看看