小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
我们在开发过程中常常会用到多线程,我们也知道多线程可以适当提高程序的执行效率,所以我们更加要了解线程的生命周期。很多人都会认为调用的线程的start方法,线程就开始执行了。其实这是错误的理解,线程调用start方法,其实是将线程加入可调度线程池,等待CPU的调度。
生命周期
新建-就绪-运行-阻塞-死亡
新建:实例化一个线程对象。
就绪:线程调用start方法,将线程加入可调度线程池,等待CPU的调度。
运行:CPU调度【可调度线程池】的线程执行。
阻塞:满足某个预定的条件时,(比如休眠或者同步锁)会阻塞线程执行,重新将线程设置为就绪状态。
死亡:
情况1:线程执行完毕,正常死亡。
情况2:非正常死亡,满足某个条件后,在线程内部终止执行(主线程中调用退出方法)。
线程执行的效率
1、线程优先级。
2、任务的复杂度。
3、CPU的调度情况。
线程池情况
1、判断核心线程池是否满了,没有满,创建线程执行任务;满了-〉2
2、判断线程池的工作队列是否满了,没有满,将任务存储到工作队列,等待CPU调度;满了-〉3
3、判断线程池是否有空闲的线程,有,安排课调度线程池的空闲线程区执行任务;没有-〉4
4、交给饱和策略去执行
- 抛异常
- 将任务回退给调用者
- 丢掉等待最久任务
- 直接丢弃任务