注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

创新改变世界

you changed the world

 
 
 

日志

 
 

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

2014-05-18 14:53:31|  分类: java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

 

一.线程基本状态图

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

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

 

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

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

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

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

 

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

  

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

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

 

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

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

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

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

  

               
  线程调用了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》

  评论这张
 
阅读(90)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017