当前位置: 首页 > 图灵资讯 > 技术篇> 线程生命周期

线程生命周期

来源:图灵教育
时间:2023-06-28 14:26:31

创建兵启动线程时,既不是一次启动就进入执行状态,也不是一直处于执行状态。在线程的生命周期中,它将被重建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。特别是当线程启动时,它不能一直“占据”CPU单独运行,因此CPU需要在多个线程之前切换,因此线程状态将在运行和阻塞之前多次切换。

新建状态(NEW):当程序使用new关键字创建一个线程时,该线程处于新状态,只有JVM为其分配内存,并初始化其成员变量值。

就绪状态(RUNNABLE):当线程对象调用start()方法时,线程处于就绪状态。Java虚拟机会调用栈和程序计数器等待调度。

运行状态(RUNNING):如果处于就绪状态的线程获得CPU,并开始执行run()方法的线程执行体,则该线程处于运行状态。

阻塞状态(Blocked):阻塞状态是指线程因某种原因放弃CPU使用权,即放弃CPU timeslice,暂时停止运行,直到线程进入可运行。(runnable)只有这样,才有机会再次获得cpu timeslice转向运行转向运行(running)状态。

阻塞有三种:

等待阻塞(o.wait -> 等待队列):运行(running)线程执行o.wait()方法,JVM将线程放入等待队列(waitting queue)中。

同步阻塞(lock->锁池):运行(running)如果同步锁被其他线程占用,JVM将该线程放入锁池(lock pool)中。

其他阻塞(sleep/join):运行(running)Threadad执行线程.sleep(long ms)或t.join()方法,或发出I/O请求时,JVM将线程置于阻塞状态。当sleep()超时时,join()等待线程终止或超时,或I/O处理完成后,现成重新转入可操作(running)状态。

线程死亡(Dead):以下三种方式结束线程,结束后处于死亡状态。

正常结束:run()或call()方法完成,线程正常结束。

异常结束:现成抛出未捕获的Exception或Eror。

调用stop: 直接调用该线程的stop()方法结束该线程-该方法通常容易导致死锁,不推荐使用。

线程生命周期_死亡状态