线程的生命周期
-
线程的五大状态:
-
新建(New):
- 线程并不是一创建就处于运行状态,也就是当我们new创建一个线程时,此时线程处于新建态。
-
就绪态(Runnable):
- 当线程对象调用了start()方法之后,该线程由新建态转换为就绪状态。Java虚拟机会为其创建方法调用栈和程序计数器,等待调度运行
-
运行态(Running):
- 当线程获得cpu资源并开始执行run方法时,此时线程处于运行态
-
阻塞态(Blocked):
- 当线程在运行状态时,失去cpu资源,此时线程处于阻塞状态
-
死亡态(Dead):
- run()或call()方法执行完成,线程正常结束
- 线程抛出一个未捕获的Exception或Error
- 直接调用了线程的stop方法暴力杀死线程时
-
线程状态转换.jpg
-
线程间的状态转换
-
新建态 转 就绪态
- 通过new关键字创建线程时,jvm其分配内存,并初始化其成员变量的值,此时线程处于新建态。当线程对象调用了start()方法之后,该线程处于就绪状态。jvm会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,只是表示该线程可以运行了。至于该线程何时开始运行,取决于JVM里线程调度器的调度
-
就绪态 转 运行态
-
当处于就绪状态的线程获得了CPU资源,开始执行run()方法时,则该线程处于运行状态,如果计算机只有一个CPU。那么在任何时刻只有一个线程处于运行状态,当然在一个多处理器的机器上,将会有多个线程并行执行;当线程数大于处理器数时,依然会存在多个线程在同一个CPU上轮换的现象。
-
当线程开始运行时,线程不可能一直处于运行态,除非线程极快的执行完。线程在运行过程中需要被中断,目的是使其他线程获得执行的机会。对于采用抢占式策略的系统而言,系统会给每个可执行的线程一个小时间段来处理任务;当该时间段用完后,系统就会剥夺该线程所占用的资源,让其他线程获得执行的机会。在选择下一个线程时,系统会考虑线程的优先级.
-
-
运行态 转 阻塞态
-
当线程尝试获取同步锁,而锁被其他线程占用,此时线程处于阻塞态
-
当线程调用sleep方法时,此时线程主动放弃cpu资源,此时线程进入阻塞态
-
程序调用了线程的suspend()方法将该线程挂起
-
线程在等待某个通知(notify)等
-
-
阻塞态 转 就绪态
- 获得同步锁
- sleep时间到
- 等待通知时,其他程序发送了通知
- 处于挂起阻塞状态时,调用了resume方法恢复
-
运行态 转 就绪态
- yield()让出cpu资源
- 失去cpu资源时。
-
网友评论