线程

一. 概念

1. 什么是线程?

  • 它是进程中的最小执行单位,并且一个进程中至少有一个线程。

2. 什么是多线程?

  • 多线程分为串行和并行
  • 串行:单条线程来执行多个任务时逐个执行;
  • 并行:单条线程同时执行多个任务;

二. 程序运行原理

1. 分时调度

  • 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。

2. 抢占式调度

  • 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度;

三. 线程的状态

1. 新建、初始状态(New)

  • 线程对象被创建后就进入了新建状态,Thread thread = new Thread();

2. 就绪(Runnable)

  • 也被称之为“可执行状态”,当线程被new出来后,其他的线程调用了该对象的start()方法,即thread.start(),此时线程位于“可运行线程池”中,只等待获取CPU的使用权,随时可以被CPU调用。进入就绪状态的进程除CPU之外,其他运行所需的资源都已经全部获得。

3. 运行(Running)

  • 线程获取CPU权限开始执行。注意:线程只能从就绪状态进入到运行状态。

4. 阻塞(Bloacked)

  • 阻塞状态是线程因为某种原因放弃CPU的使用权,暂时停止运行,知道线程进入就绪状态后才能有机会转到运行状态。
    4.1 阻塞的情况分三种:
    4.1.1 等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池中”。进入这个状态后是不能自动唤醒的,必须依靠其他线程调用notify()或者notifyAll()方法才能被唤醒。
    4.1.2 同步阻塞:运行的线程在获取对象的(synchronized)同步锁时,若该同步锁被其他线程占用,则JVM会吧该线程放入“锁池”中。
    4.1.3 其他阻塞:通过调用线程的sleep()或者join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新回到就绪状态

5. 死亡(Dead)

  • 线程执行完了或因异常退出了run()方法,则该线程结束生命周期。

参考地址:

https://www.cnblogs.com/jmsjh/p/7762034.html
https://blog.csdn.net/qq_41701956/article/details/84861232