说一说线程的生命周期
线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁。
新建:就是刚使用new方法,new出来的线程;
就绪:就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;
运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;
阻塞:在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态;
销毁:如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源;
完整的生命周期图如下:
一个线程的生命周期,共包括五种状态,分别是新建、就绪、运行、阻塞、死亡。
当线程被创建后,它默认处于新建状态。这时它就是一个普通的Java对象,并不会表现出任何线程的特征,线程体也不会被执行。此时,JVM会为线程对象分配内存,并初始化其成员变量的值。
当调用线程对象的start()方法后,该线程处于就绪状态。这时线程也没有开始运行,这个状态只表示线程是可以运行的,至于线程何时运行,取决于JVM里线程调度器的调度。此时,JVM会为线程创建调用栈和程序计数器。
如果线程获得了CPU开始执行线程体,则线程处于运行状态。对于单处理器的计算机,同一时刻只有一个线程处于运行状态。对于多处理器的计算机,将会有多个线程并行执行。
线程开始运行后,不会一直处于运行状态,它会因为CPU的轮换而产生中断。具体来说,当发生如下情况时,线程会进入阻塞状态:调用sleep()、调用阻塞式IO方法、未抢到锁被阻塞、等待某个通知、被suspend()挂起。
最后,线程会以如下三种方式结束,结束之后便进入死亡状态:线程体执行完毕、线程抛出异常、直接调用stop()方法来结束线程。
加分回答
当线程处于阻塞状态时,会通过如下情形解除阻塞,使其重新回到就绪状态:
得分点
新建、就绪、运行、阻塞、死亡
参考答案
标准回答
一个线程的生命周期,共包括五种状态,分别是新建、就绪、运行、阻塞、死亡。
当线程被创建后,它默认处于新建状态。这时它就是一个普通的Java对象,并不会表现出任何线程的特征,线程体也不会被执行。此时,JVM会为线程对象分配内存,并初始化其成员变量的值。
当调用线程对象的start()方法后,该线程处于就绪状态。这时线程也没有开始运行,这个状态只表示线程是可以运行的,至于线程何时运行,取决于JVM里线程调度器的调度。此时,JVM会为线程创建调用栈和程序计数器。
如果线程获得了CPU开始执行线程体,则线程处于运行状态。对于单处理器的计算机,同一时刻只有一个线程处于运行状态。对于多处理器的计算机,将会有多个线程并行执行。
线程开始运行后,不会一直处于运行状态,它会因为CPU的轮换而产生中断。具体来说,当发生如下情况时,线程会进入阻塞状态:调用sleep()、调用阻塞式IO方法、未抢到锁被阻塞、等待某个通知、被suspend()挂起。
最后,线程会以如下三种方式结束,结束之后便进入死亡状态:线程体执行完毕、线程抛出异常、直接调用stop()方法来结束线程。
加分回答
当线程处于阻塞状态时,会通过如下情形解除阻塞,使其重新回到就绪状态:
延伸阅读
线程5种状态的转换关系,如下图所示: