Java线程状态与生命周期

线程生命周期示意图:



 

线程的状态:

1. 初始状态(New)

当创建了线程对象实例 即 new Thread(...) 之后,线程进入初始状态,注意这个时候,它还仅仅是一个普通的对象实例,而不是真正的线程,JVM也不会分配相应的资源,例如栈内存空间。

 

2. 可运行状态/就绪状态(Runnable)

调用了start()方法之后,线程位于“可运行线程池”中,变得可运行也即就绪,只等待获取CPU的使用权即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。

 

3. 运行状态(Running)

就绪状态的线程被操作系统选中,获取了CPU时间片,执行程序代码即进入运行状态。

运行状态的线程如果执行了yield()方法,出让了CPU,就会回到就绪状态,这时候与其他线程处于同等竞争状态,但如果操作系统没有忽略线程的优先级设定,那么比该线程优先级高的线程才能获得CPU的调度执行,如果没有则依然会再次调度该线程执行。

 

4. 阻塞状态(Blocked)

线程由于某种原因放弃了CPU使用权,暂时停止执行,即为阻塞状态,阻塞状态的线程必须重新进入就绪状态,才有机会重新转到运行状态。阻塞的情况分下面几种:

(1)、等待阻塞(WAITING):运行的线程执行了wait()方法,JVM释放该线程占用的所有资源,并将其放入“等待队列/等待池”,进入该状态的线程不能自动唤醒,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒。

(2)、同步阻塞(BLOCKED):运行的线程若在需要获取同步锁(如synchronized等)时,发现同步锁已经被其他线程占用,则JVM会把该线程放入“锁池”中,锁池中以列队的形式(即先到先得)存放着所有正在等待相同同步锁的线程,一旦获得需要的同步锁对象标记,就转入就绪状态。

(3)、其他阻塞(TIMED_WAITING):当运行的线程调用了自身的sleep()方法、或者其他线程的join()方法、或者发生了I/O请求阻塞,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

(4)、线程挂起:运行的线程执行了suspend()方法之后,线程进入阻塞状态,并且不能自动恢复,需要调用其resume()方法,才能使线程重新进入就绪状态。

 

5. 终止状态(Terminated)

 线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

猜你喜欢

转载自pzh9527.iteye.com/blog/2383953