比如 下载好的播放器 播放器能播放视频 是因为它底层有很多写好的代码来支持 这就是程序
    当打开播放器的时候 正在运行的那个程序 就是进程
    看视频时 调整声音大小不会使视频停顿 相当于不同的小人在做事 一个播放视频 一个控制声音 这就是线程

    比如 班级大扫除
    扫除分配任务 在纸上列一个清单—->程序
    开始扫除—->线程
    每个同学负责自己的事 并发执行 互不影响—->线程

    程序
    可以理解为是一组静态代码
    进程(一个进程有很多个小线程同时运行 由此产生多线程并发问题)
    正在进行的程序 将静态的代码 运行起来
    线程(是进程的最小组成单元)
    正在执行程序中的小单元

    1.主线程 系统线程
    2.用户线程 main
    3.守护线程(精灵线程) GC

    线程——>操作系统级别的 CPU来控制 CPU分配时间碎片 才能让线程执行 不是我们说了算

    如何在java中创建线程 让线程执行 多线程
    掌握每一个线程的几种状态 及 状态之间的转换

    new start() CPU分配 run() wait() exception over
    创建线程————>就绪状态————>执行状态————>等待/挂起————>异常/消亡
    | |
    |_|
    如果还能执行 就回到就绪状态
    notify / notifyAll

    实现线程的过程 方式1:
    1.自己描述一个类
    2.继承一个父类 Thread
    3.重写run方法
    4.new一个线程对象 调用start()方法 让线程进入就绪状态 等待CPU分配时间碎片后就可以执行了
    例子:

    1. public class RunningMan extends Thread{
    2. private String name;
    3. private RunningMan(){}
    4. public RunningMan(String name){
    5. this.name = name;
    6. }
    7. //重写run方法
    8. public void run(){
    9. for(int i = 0;i<=100;i++){
    10. System.out.println(this.name+"跑到第"+i+"米了");
    11. }
    12. }
    13. public static void main(String[] args){
    14. RunningMan r1 = new RunningMan("苏炳添");
    15. RunningMan r2 = new RunningMan("博尔特");
    16. RunningMan r3 = new RunningMan("加特林");
    17. //调用start方法(从Thread类中继承的) 让线程进入就绪状态
    18. //如果直接调用run() 就不是多线程了 run是先让r1先执行一遍
    19. //r2在执行一遍 再到r3 就是按顺序逐个执行
    20. r1.start();
    21. r2.start();
    22. r3.start();
    23. }
    24. }

    Java是单继承 如果一个类继承了其他类 同时又想继承Thread
    实现线程的过程 方式2:
    1.自己描述一个类
    2.实现一个父接口 Runnable
    3.重写run方法
    4.new一个线程对象 创建一个Thread对象 将自己的对象包起来 以此来通过Thread对象调用start()方法
    例子:

    1. public class RunningMan implements Runnable{
    2. private String name;
    3. private RunningMan(){}
    4. public RunningMan(String name){
    5. this.name = name;
    6. }
    7. //重写run方法
    8. public void run(){
    9. for(int i = 0;i<=100;i++){
    10. System.out.println(this.name+"跑到第"+i+"米了");
    11. }
    12. }
    13. public static void main(String[] args){
    14. RunningMan r1 = new RunningMan("苏炳添");
    15. RunningMan r2 = new RunningMan("博尔特");
    16. RunningMan r3 = new RunningMan("加特林");
    17. //创建一个线程对象 可以将r1包起来 从而可以调用start方法
    18. Thread t1 = new Thread(r1);
    19. Thread t2 = new Thread(r2);
    20. Thread t3 = new Thread(r3);
    21. t1.start();
    22. t2.start();
    23. t3.start();
    24. }
    25. }