当前位置: 首页 > 后端技术 > Java

线程生命周期

时间:2023-04-01 20:30:22 Java

概述一个线程的生命周期由五个阶段组成,包括:新建、就绪、运行、阻塞、死亡。当线程进入运行状态时,一般操作系统会采用抢占的方式让线程获得CPU。所以CPU需要在多个线程之间切换,所以线程状态也会多次在running、blocking、ready之间切换。1.创建新线程:使用new方法创建新线程。这时只有JAVA虚拟机为其分配内存,并初始化成员变量的值。此时它只是一个对象。2.就绪:调用线程的start()方法后,此时线程正在等待CPU分配资源。谁先抢到CPU资源,谁就开始执行;线程进入就绪状态,JAVA虚拟机为其创建方法。调用堆栈和程序计数器。线程的执行受底层平台控制,具有一定的随机性。3、运行并运行:当就绪线程被调度并获得CPU资源后,进入运行状态。run方法定义了线程的运行和功能;(当处于就绪态的线程获得CPU后,会执行run()方法)对于单核cpu(或一个核),同一时刻只能执行一条指令,JVM实现了多核通过快速切换线程来执行指令。真正的处理器可以同时处理一条指令,但这种切换速度如此之快,我们甚至没有注意到。为了在线程切换后恢复到正确的执行位置,每个线程都有一个独立的程序计数器,每个线程的计数器互不影响,独立存储。当一个线程开始运行时,它不可能一直占据CPU(除非线程执行体很短,瞬间执行结束)。因此,线程在执行过程中需要被打断,才能让其他线程获得CPU执行的机会。线程调度的细节取决于底层平台采用的策略。4.阻塞:在运行状态下,处于运行状态的线程可能会因为某些原因而变成阻塞状态。原因如下:1.等待I/O流的输入输出2.等待网络资源,即网速问题3.调用sleep()方法,需要等待睡眠时间toend4.调用wait()方法,需要调用notify()唤醒线程5.其他线程执行join()方法时,当前线程会被阻塞,需要等待其他线程执行完毕.五、死亡1、run()/call()方法执行完毕,线程正常结束;2.线程抛出未捕获的Exception或Error;3、直接调用线程的stop()方法结束线程——这种方法容易死锁,一般不推荐。