Java 多线程(八) 线程状态图

时间:2021-04-20 18:13:44

Java 多线程(八) 线程状态图

结合多线程的学习过程,介绍线程的状态图,随着学习的深入,这幅图不断加入新的内容。

 

一.线程基本状态图

  这幅图是在Java 多线程(三) 线程的生命周期及优先级出现过的:

Java 多线程(八) 线程状态图

  图中是线程运行的基本状态:线程调用start()方法开始后,就进入到可运行状态,随着CPU的资源调度在运行和可运行之间切换;遇到阻塞则进入阻塞状态。

 

二.加入同步的线程状态图

  多线程的同步机制,及synchronized关键字的使用学习:

  Java 多线程(五) 多线程的同步

  Java 多线程(六) synchronized关键字详解                        

 

  于是状态图加入了底下的一部分,如下:

  Java 多线程(八) 线程状态图

  当资源被一个线程访问时,上锁,其他线程就进入了一个锁池(Lock pool)

  当锁被释放,其他线程获得了锁,就变为可运行状态。

 

三.加入线程间的相互作用

  线程间的相互作用:Java 多线程(七) 线程间的通信

  主要是wait和notify方法的介绍。

  具有wait()和notify()的线程状态图:

  Java 多线程(八) 线程状态图

               
  线程调用了wait()方法之后,释放掉锁,进入等待池(Wait pool) ;收到通知之后等待获取锁,获取锁之后才可以运行。

 

总结

  线程被阻塞可能是由于下面五方面的原因:(《Thinking in Java》)

  1.调用sleep(毫秒数),使线程进入睡眠状态。在规定时间内,这个线程是不会运行的。

  2.用suspend()暂停了线程的执行。除非收到resume()消息,否则不会返回“可运行”状态。

  3.用wait()暂停了线程的执行。除非线程收到notify()或notifyAll()消息,否则不会变成“可运行”状态。

  4.线程正在等候一些IO操作完成。

  5.线程试图调用另一个对象的“同步”方法,但那个对象处于锁定状态,暂时无法使用。

 

  所以其实仍然可以使用第一张图来概括性地说明线程的生命周期及各个状态。只不过线程被阻塞的情况分为很多种,后面的图是细化说明。

  所涉及到的两种池:

  Wait pool 等待池

  Lock pool 锁池

 

参考资料

  圣思园张龙老师Java SE系列视频教程。

  《Thinking in Java》