﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Liver's Java-随笔分类-CoreJava</title><link>http://www.blogjava.net/liver/category/40052.html</link><description>坚持！每次一小步，最终会成一大步。不要太在意结果，只求能够完善过程。</description><language>zh-cn</language><lastBuildDate>Thu, 04 Jun 2009 03:33:06 GMT</lastBuildDate><pubDate>Thu, 04 Jun 2009 03:33:06 GMT</pubDate><ttl>60</ttl><item><title>再谈线程：生产者与消费者</title><link>http://www.blogjava.net/liver/archive/2009/06/04/279970.html</link><dc:creator>Liver</dc:creator><author>Liver</author><pubDate>Thu, 04 Jun 2009 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/liver/archive/2009/06/04/279970.html</guid><wfw:comment>http://www.blogjava.net/liver/comments/279970.html</wfw:comment><comments>http://www.blogjava.net/liver/archive/2009/06/04/279970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liver/comments/commentRss/279970.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liver/services/trackbacks/279970.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 昨天提到了线程，那么就不得不提到&#8220;生产者与消费者&#8221;这样一个经典的线程同步问题。场景描述：&nbsp;&nbsp;&nbsp;&nbsp;一个仓库，生产者在工厂里生产了产品后，将产品存放到仓库里，仓库存放数量有限，当满仓后，停止生产，直到有消费着将产品消费后才继续生产；消费者从仓库里提取产品，当仓库空仓时，停止消费产品，直到仓库中有产品时，才继续消费产品。...&nbsp;&nbsp;<a href='http://www.blogjava.net/liver/archive/2009/06/04/279970.html'>阅读全文</a><img src ="http://www.blogjava.net/liver/aggbug/279970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liver/" target="_blank">Liver</a> 2009-06-04 10:57 <a href="http://www.blogjava.net/liver/archive/2009/06/04/279970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线程7种状态的相互转换</title><link>http://www.blogjava.net/liver/archive/2009/06/04/279924.html</link><dc:creator>Liver</dc:creator><author>Liver</author><pubDate>Wed, 03 Jun 2009 16:06:00 GMT</pubDate><guid>http://www.blogjava.net/liver/archive/2009/06/04/279924.html</guid><wfw:comment>http://www.blogjava.net/liver/comments/279924.html</wfw:comment><comments>http://www.blogjava.net/liver/archive/2009/06/04/279924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liver/comments/commentRss/279924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liver/services/trackbacks/279924.html</trackback:ping><description><![CDATA[今天有同事问到线程的问题，自己突然就有点蒙了，只模糊的记得个大概。<br />
当初学习线程的时候把这7个状态记得比自己名字还熟悉<br />
还把这7个状态编成了一段凄惨而美丽的爱情故事<br />
没想到如今却只能记得个大概<br />
真验证了&#8220;好记性不如烂笔头&#8221;的真理<br />
还是赶快回忆一下吧<br />
<br />
先从图片开始<br />
<img height="447" alt="" src="http://www.blogjava.net/images/blogjava_net/liver/thread.jpg" width="690" border="0" /><br />
<br />
小小的作下解释：<br />
1、线程的实现有两种方式，一是继承Thread类，二是实现Runnable接口，但不管怎样，当我们new了这个对象后，线程就进入了<span style="color: red"><strong>初始状态</strong></span>；<br />
2、当该对象调用了start()方法，就进入<span style="color: red"><strong>可运行状态</strong></span>；<br />
3、进入可运行状态后，当该对象被操作系统选中，获得CPU时间片就会进入<span style="color: red"><strong>运行状态</strong></span>；<br />
4、进入运行状态后情况就比较复杂了<br />
&nbsp;&nbsp;&nbsp; 4.1、run()方法或main()方法结束后，线程就进入<span style="color: red"><strong>终止状态</strong></span>；<br />
&nbsp;&nbsp;&nbsp; 4.2、当线程调用了自身的sleep()方法或其他线程的join()方法，就会进入<strong style="color: red">阻塞状态</strong>（该状态既停止当前线程，但并<span style="color: red">不释放所占有的资源</span>）。当sleep()结束或join()结束后，该线程进入可运行状态，继续等待OS分配时间片；<br />
&nbsp;&nbsp;&nbsp; 4.3、线程调用了yield()方法，意思是放弃当前获得的CPU时间片，回到可运行状态，这时与其他进程处于同等竞争状态，OS有可能会接着又让这个进程进入运行状态；<br />
&nbsp;&nbsp; 4.4、当线程刚进入可运行状态（注意，还没运行），发现将要调用的资源被<font style="background-color: #cce8cf">synchroniza</font>（同步），获取不到锁标记，将会立即进入<span style="color: red"><strong>锁池状态</strong></span>，等待获取锁标记（这时的<font style="background-color: #cce8cf">锁</font>池里也许已经有了其他线程在等待获取<font style="background-color: #cce8cf">锁</font>标记，这时它们处于队列状态，既先到先得），一旦线程获得<font style="background-color: #cce8cf">锁</font>标记后，就转入可运行状态，等待OS分配CPU时间片；<br />
&nbsp;&nbsp; 4.5、当线程调用wait()方法后会进入<span style="color: red"><strong>等待队列</strong></span>（进入这个状态会释放所占有的所有资源，与阻塞状态不同），进入这个状态后，是不能自动唤醒的，必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒（由于notify()只是唤醒一个线程，但我们由不能确定具体唤醒的是哪一个线程，也许我们需要唤醒的线程不能够被唤醒，因此在实际使用时，一般都用notifyAll()方法，唤醒有所线程），线程被唤醒后会进入锁池，等待获取锁标记。<br />
<br />
总算全部回忆了一遍JDK1.5在API的使用上有了较好的改进，效率得到很大的提高，不过几个状态转换的原理还是一样。<br />
<br />
额&#8230;&#8230;不过那一段凄惨而美丽的爱情故事还没完全想起来，那天全部回忆起来了在写吧。 
  <img src ="http://www.blogjava.net/liver/aggbug/279924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liver/" target="_blank">Liver</a> 2009-06-04 00:06 <a href="http://www.blogjava.net/liver/archive/2009/06/04/279924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>