共计 891 个字符,预计需要花费 3 分钟才能阅读完成。
概述
线程的生命周期蕴含 5 个阶段,包含:新建、就绪、运行、阻塞、死亡。
当线程进入运行状态后,个别的操作系统是采纳抢占式的形式来让线程取得 CPU。所以 CPU 须要在多条线程之间切换,于是线程状态也会屡次在运行、阻塞、就绪之间切换。
一、新建
新建:应用 new 办法,new 进去线程,此时仅仅由 JAVA 虚拟机为其分配内存,并初始化成员变量的值。此时仅仅是个对象。
二、就绪
就绪:就是调用的线程的 start()办法后,这时候线程处于期待 CPU 分配资源阶段,谁先抢的 CPU 资源,谁开始执行;
该线程进入就绪状态,JAVA 虚构机会为其创立办法调用栈和程序计数器。线程的执行是由底层平台管制,具备肯定的随机性。
三、运行
运行:当就绪的线程被调度并取得 CPU 资源时,便进入运行状态,run 办法定义了线程的操作和性能;(当处于就绪状态的线程取得 CPU,它就会执行 run()办法)
对于一个单核 cpu(或者是一个内核)来说,只能同时执行一条指令,而 JVM 通过疾速切换线程执行指令来达到多线程的,真正处理器就能同时解决一条指令,只是这种切换速度很快,咱们基本不会感知到。为了线程切换后能复原到正确的执行地位,每条线程都有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储。
当一个线程开始运行后,它不可能始终持有 CPU(除非该线程执行体十分短,霎时就执行完结了)。所以,线程在执行过程中须要被中断,目标是让其它线程取得执行的 CPU 的机会。线程的调度细节取决于底层平台所采纳的策略。
四、阻塞
阻塞:在运行状态的时候,可能因为某些起因导致运行状态的线程变成了阻塞状态。起因如下:
1. 期待 I / O 流的输入输出
2. 期待网络资源,即网速问题
3. 调用 sleep()办法,须要等 sleep 工夫完结
4. 调用 wait()办法,须要调用 notify()唤醒线程
5. 其余线程执行 join()办法,以后线程则会阻塞,须要等其余线程执行完。
五、死亡
1、run()/call() 办法执行实现,线程失常完结;
2、线程抛出一个未捕捉的 Exception 或 Error;
3、间接调用线程的 stop()办法完结该线程——该办法容易导致死锁,通常不倡议应用。