A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

继承thread类创建线程——分析
  1. class Demo extends Thread//继承Thread对象,让他成为Thread类的子类,这样就可以使用Thread类中的方法了
  2. {
  3.         public void run(){//将需要执行的代码放在这里
  4.                 for(int i=0;i<68;i++){
  5.                         System.out.println("Demo run.."+i);
  6.                 }
  7.         }
  8. }
  9. class ThreadDemo_1
  10. {
  11.         public static void main(String[] args)
  12.         {
  13.                 Demo d=new Demo();//创建了一个线程
  14.                 //d.run();//如果这样的话,就是调用demo的run()方法, 只有一个主线程
  15.                 d.start();//调用这个方法, 就是创建这个线程, 并启动了这个线程,让线程开始执行,JVM就会调用这个线程的run()方法了
  16.                 for(int i=0;i<68;i++){
  17.                         System.out.println("main..."+i);
  18.                 }
  19.         }
  20. }
复制代码
开始由Jvm创建了主线程,


到了d=newDemo();,就创建了新的控制单元,线程被创建了,被主线程所开启的     
那么这个程序就多了一个执行路径

这里需要注意:
这两个线程在CPU不会同时执行的,Cpu在某一个时刻只执行一个执行路径,那么CPU在这些程序之间做着快速的切换,速度很快, 所以你会感觉同时执行,
所以CPU 在切换进程, 也就是在切换每个线程。
多个线程在争抢CPU的资源,真正的是CPU 在执行,一个意思,

主线程完了, 但是d还没有完, 搞定后,才停止。
但是这个程序的运行结果每次的都不同, 原因:
因为多个线程都在获取cpu 的执行权, cpu执行到谁, 谁就运行,明确一点, 在某一个时刻, 只能有一个程序在运行,(多核除外)
我们可以形象把多线程的运行行为在互相抢夺Cpu的执行权
这就是多线程的一个特性: 随机性 谁抢到谁执行,至于执行多长,cpu说的算

这样Cpu就优化资源。
为什么要覆盖run方法呢?
Thread类用于描述线程

该类就定义了一个功能, 用于存储线程要运行的代码 该存储功能就是run方法;
同样,主线程要运行的代码在main方法中, 这是JVM定义,存放在main方法中;
如果直接在主线中run()方法
可以直接调用run ,但是在run()方法中没有任何东西,
开启线程的目的是为了运行指定的代码,父类提供了空间,你有代码的话,怎么做才能被运行到呢?
复写run(),并将需要运行的代码放在run()中, 这样就可以运行到了;
编译的时候, 运行的是start(), 调用的是父类的run()方法, 但是子类把父类的run()方法给覆盖了,所以调用的是子类的run()方法,

这就是继承thread的类并复写run()方法了,


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马