<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>南村土人</title>
    <description></description>
    <link>http://agio.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>准则：采用参与者与参与者目标的视点</title>
        <author>jokermanager</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://agio.javaeye.com">jokermanager</a>&nbsp;
          链接：<a href="http://agio.javaeye.com/blog/212009" style="color:red;">http://agio.javaeye.com/blog/212009</a>&nbsp;
          发表时间: 2008年07月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1、一组用例实例，每个实例是系统所执行的一系列活动，以此产生对特定参与者具有价值的可观察结果。</p>
<p>&nbsp;</p>
<p>2、关注系统的用户或参与者来编写需求，询问其目标和典型情况。</p>
<p>&nbsp;</p>
<p>3、关注理解参与者所考虑的有价值结果。</p>
          <br/>
          <span style="color:red;">
            <a href="http://agio.javaeye.com/blog/212009#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 Jul 2008 11:20:43 +0800</pubDate>
        <link>http://agio.javaeye.com/blog/212009</link>
        <guid>http://agio.javaeye.com/blog/212009</guid>
      </item>
      <item>
        <title>准则：编写黑盒用例</title>
        <author>jokermanager</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://agio.javaeye.com">jokermanager</a>&nbsp;
          链接：<a href="http://agio.javaeye.com/blog/212007" style="color:red;">http://agio.javaeye.com/blog/212007</a>&nbsp;
          发表时间: 2008年07月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1、黑盒用例是最常用的和推荐使用的类型。它不对系统内部的工作、构件或设计进行描述。</p>
<p>&nbsp;</p>
<p>2、黑盒用例以职责来描述系统，这是面向对象思想中普遍统一的隐喻主题-软件元素具有职责，并与其他具有职责的元素进行协作。</p>
<p>&nbsp;</p>
<p>3、黑盒用例定义系统职责，可以规定系统必须做什么，而不必关心系统如何去做。</p>
<p>&nbsp;</p>
<p>4、分析与设计的区别，就在于&rdquo;什么&ldquo;和&rdquo;如何&ldquo;。</p>
<p>&nbsp;</p>
<p>5、在分析中应避免进行&rdquo;如何&ldquo;的决策，而是规定系统的外部行为。</p>
<p>&nbsp;</p>
<p>6、在设计过程中，创建满足该规则说明的解决方案。</p>
          <br/>
          <span style="color:red;">
            <a href="http://agio.javaeye.com/blog/212007#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 Jul 2008 11:12:09 +0800</pubDate>
        <link>http://agio.javaeye.com/blog/212007</link>
        <guid>http://agio.javaeye.com/blog/212007</guid>
      </item>
      <item>
        <title>准则：编写简洁的用例</title>
        <author>jokermanager</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://agio.javaeye.com">jokermanager</a>&nbsp;
          链接：<a href="http://agio.javaeye.com/blog/212004" style="color:red;">http://agio.javaeye.com/blog/212004</a>&nbsp;
          发表时间: 2008年07月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1、应该编写简洁的用例，删除&ldquo;噪音&rdquo;词汇。</p>
<p>&nbsp;</p>
<p>2、即使是一些细微之处也会积累为繁琐。</p>
          <br/>
          <span style="color:red;">
            <a href="http://agio.javaeye.com/blog/212004#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 Jul 2008 11:07:28 +0800</pubDate>
        <link>http://agio.javaeye.com/blog/212004</link>
        <guid>http://agio.javaeye.com/blog/212004</guid>
      </item>
      <item>
        <title>准则：以无用户界面约束的本质风格编写用例</title>
        <author>jokermanager</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://agio.javaeye.com">jokermanager</a>&nbsp;
          链接：<a href="http://agio.javaeye.com/blog/212002" style="color:red;">http://agio.javaeye.com/blog/212002</a>&nbsp;
          发表时间: 2008年07月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1、通过对目标层次的研究，系统分析员会发现与实现机制无关的目标。</p>
<p>&nbsp;</p>
<p>2、这种对根源目标的发现过程能够扩展视野，以促成新的和改进的解决方案。</p>
<p>&nbsp;</p>
<p>3、摈除用户界面于思考范围之外，集中于意图。</p>
<p>&nbsp;</p>
<p>4、以本质风格编写用例，摈除用户界面并且关注参与者的意图。</p>
<p>&nbsp;</p>
<p>5、具体风格的用例编写方式，不适合于早期的需求分析工作，应该避免。</p>
          <br/>
          <span style="color:red;">
            <a href="http://agio.javaeye.com/blog/212002#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 Jul 2008 11:03:56 +0800</pubDate>
        <link>http://agio.javaeye.com/blog/212002</link>
        <guid>http://agio.javaeye.com/blog/212002</guid>
      </item>
      <item>
        <title>知识丰富的设计</title>
        <author>jokermanager</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://agio.javaeye.com">jokermanager</a>&nbsp;
          链接：<a href="http://agio.javaeye.com/blog/211979" style="color:red;">http://agio.javaeye.com/blog/211979</a>&nbsp;
          发表时间: 2008年07月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1、业务活动与规则对于一个领域来说与其涉及的实体同样重要。</p>
<p>&nbsp;</p>
<p>2、领域也会包含各种类别的概念。对知识的消化要能够产生出反映这种理解的模型。</p>
<p>&nbsp;</p>
<p>3、超越实体与值之上的变化可能会对知识消化产生剧烈的影响，因为业务规则之间可能存在不一致。</p>
<p>&nbsp;</p>
<p>4、领域专家通过与软件专家的密切合作，进行知识消化，才使得规则明晰化。</p>
<p>&nbsp;</p>
<p>5、提炼隐藏概念，将业务规则可以放到一个领域对象中。</p>
<p>&nbsp;</p>
<p>6、任何业务专家都不可能阅读代码来检对规则。</p>
<p>&nbsp;</p>
<p>7、一个非业务人员的技术人员，要将需求文档与代码联系起来是很困难的。</p>
<p>&nbsp;</p>
<p>8、可以通过改善设计来更好的捕获知识。</p>
<p>&nbsp;</p>
<p>9、规则的实现应该是独立的。</p>
<p>&nbsp;</p>
<p>10、一个领域模型和其相应的设计能够被用来保护和分享知识。</p>
<p>&nbsp;</p>
<p>11、航运中的超额预定是一个重要的业务规则，并不仅仅是一个含糊的计算问题。</p>
          <br/>
          <span style="color:red;">
            <a href="http://agio.javaeye.com/blog/211979#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 Jul 2008 10:05:30 +0800</pubDate>
        <link>http://agio.javaeye.com/blog/211979</link>
        <guid>http://agio.javaeye.com/blog/211979</guid>
      </item>
      <item>
        <title>Replace Array with Object 以对象取代数组</title>
        <author>jokermanager</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://agio.javaeye.com">jokermanager</a>&nbsp;
          链接：<a href="http://agio.javaeye.com/blog/211922" style="color:red;">http://agio.javaeye.com/blog/211922</a>&nbsp;
          发表时间: 2008年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1、如果一个数组中的各个元素代表了不同的东西，考虑用Object来代替数组。</p>
<p>&nbsp;</p>
<p>2、数组应该只用于容纳一组相似对象。</p>
<p>&nbsp;</p>
<p>3、如果一个数组容纳了不同对象，会给array用户带来麻烦。</p>
          <br/>
          <span style="color:red;">
            <a href="http://agio.javaeye.com/blog/211922#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Jul 2008 20:26:54 +0800</pubDate>
        <link>http://agio.javaeye.com/blog/211922</link>
        <guid>http://agio.javaeye.com/blog/211922</guid>
      </item>
      <item>
        <title>常见的软件隐喻</title>
        <author>jokermanager</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://agio.javaeye.com">jokermanager</a>&nbsp;
          链接：<a href="http://agio.javaeye.com/blog/211918" style="color:red;">http://agio.javaeye.com/blog/211918</a>&nbsp;
          发表时间: 2008年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1、重要的研发成果常常产自类比。通过把你不太理解的东西和你较为理解、十分类似的东西进行比较，你可以对这些不太理解的东西产生更深刻的理解。这种使用隐喻的方法叫做&ldquo;建模&rdquo;。</p>
<p>&nbsp;</p>
<p>2、软件隐喻不会告诉你到哪里去找答案，仅告诉你该如何找到答案。隐喻的作用更像启示，而不是算法。</p>
<p>&nbsp;</p>
<p>3、&ldquo;增量的&rdquo;、&ldquo;迭代的&rdquo;、&ldquo;自适应的&rdquo;、&ldquo;演进的&rdquo;，以增量的方式进行设计、编码和测试，是目前已知的最强有力的软件开发概念。</p>
<p>&nbsp;</p>
<p>4、进行增量开发时，我们先做出软件系统一个尽可能简单、但能运行的版本。它仅仅需要构成一个足够强壮的骨架，支撑起来未来将要开发的真实系统。</p>
<p>&nbsp;</p>
<p>5、增量开发的优势在于未做过的承诺。</p>
<p>&nbsp;</p>
<p>6、软件开发中的几个事项：问题定义、架构设计、详细设计、构建、优化、评审、详查。</p>
<p>&nbsp;</p>
<p>7、使用现成的东西，自己编写能买到的代码是没有意义的。</p>
<p>&nbsp;</p>
<p>8、适当的多层次的规划对于建造建筑和构建软件都是有好处的。</p>
<p>&nbsp;</p>
<p>9、精心计划，并不意味着事无巨细的计划或者过度的计划。</p>
<p>&nbsp;</p>
<p>10、一个规划得当的项目能够提升你&ldquo;在后期改变细节（设计）&rdquo;的能力。</p>
<p>&nbsp;</p>
<p>11、不同的软件项目能够从不同的开发方法中获益。</p>
<p>&nbsp;</p>
<p>12、软件开发中，通常你只需要用灵活的、轻量级的方法，但有时你就必须得用严格的、重量级的开发方法，以达到所需的安全性目标或其他目标。</p>
<p>&nbsp;</p>
<p>13、对于超大型的软件项目，就需要比一般规模项目有更高级别的规划设计。</p>
<p>&nbsp;</p>
<p>14、技术并不是规矩，它只是分析工具。好的工匠知道完成某项工作需要什么工具，也知道如何正确使用，程序员也该这样。不存在任何一个能适用于所有工作的工具，因地制宜地选择工具是称为能有效编程的程序员的关键。</p>
<p>&nbsp;</p>
<p>15、隐喻只是一种启发方法而不是算法，他们之间并不排斥。应当使用对你最有益处的某种隐喻组合。</p>
          <br/>
          <span style="color:red;">
            <a href="http://agio.javaeye.com/blog/211918#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Jul 2008 20:14:40 +0800</pubDate>
        <link>http://agio.javaeye.com/blog/211918</link>
        <guid>http://agio.javaeye.com/blog/211918</guid>
      </item>
      <item>
        <title>知识消化</title>
        <author>jokermanager</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://agio.javaeye.com">jokermanager</a>&nbsp;
          链接：<a href="http://agio.javaeye.com/blog/211916" style="color:red;">http://agio.javaeye.com/blog/211916</a>&nbsp;
          发表时间: 2008年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1、高效的建模人员就是知识的消化器。</p>
<p>&nbsp;</p>
<p>2、知识消化并不是一个孤立的行动，它由开发团队与领域专家共同合作，由开发人员领导。</p>
<p>&nbsp;</p>
<p>3、老式的瀑布方法中，业务专家与分析人员会谈，分析人员提取摘要，进行抽象后将结果转达给程序员，由程序员进行编码。这种方法并不成功，因为没有反馈机制。</p>
<p>&nbsp;</p>
<p>4、优秀的程序员会自然地开始进行抽象来开发一个模型。</p>
<p>&nbsp;</p>
<p>5、在团队成员一起讨论模型的过程中，他们之间的交互也会发生变化。模型的不断精化使得开发人员不断学习他们所需要的重要业务原理。领域专家通过提炼他们认为必须的知识来精化他们的理解。</p>
<p>&nbsp;</p>
<p>6、程序员、分析人员、领域专家都介入其中，模型变得组织有序并且抽象合理，能够反应业务的深层知识。抽象出来的都是真正的业务原则。</p>
<p>&nbsp;</p>
<p>7、模型永远都不是完美的，他们会不断发展。模型对于领域来说必须是实用的。他们必须十分精确，使得应用程序易于实现和理解。</p>
          <br/>
          <span style="color:red;">
            <a href="http://agio.javaeye.com/blog/211916#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Jul 2008 19:52:46 +0800</pubDate>
        <link>http://agio.javaeye.com/blog/211916</link>
        <guid>http://agio.javaeye.com/blog/211916</guid>
      </item>
      <item>
        <title>有效建模的因素</title>
        <author>jokermanager</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://agio.javaeye.com">jokermanager</a>&nbsp;
          链接：<a href="http://agio.javaeye.com/blog/211914" style="color:red;">http://agio.javaeye.com/blog/211914</a>&nbsp;
          发表时间: 2008年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1. 模型与实现相互绑定。未经加工的原型建立了早期必需的联系，在随后的迭代中始终对它进行维护和完善。</p>
<p>&nbsp;</p>
<p>2. 基于模型生成了一种语言。随着项目的进行，我们中的每个人都可以自如地使用来自模型的术语，将它们组织成与模型结构一致的句子，不需翻译，也不会引起歧义。</p>
<p>&nbsp;</p>
<p>3. 开发了一个包含丰富知识的模型。对象都具有行为和一些强制性的规则。模型并不仅仅是一个数据方案，它是解决一个复杂问题必不可缺的。它捕获了各种类型的知识。</p>
<p>&nbsp;</p>
<p>4. 提炼模型。在模型变得更加完善的过程中，一些重要的概念被加入其中。同样重要的是，如果概念被证明没有用处或并不重要，则应该丢弃。如果一个不必要的概念与一个需要的概念结合在一起，新的模型将会分离出有用的概念而丢弃另一个。</p>
<p>&nbsp;</p>
<p>5. 头脑风暴与实验。与草图和头脑风暴方式相结合的语言使得我们的讨论成为模型实验室，在这里，会对数以百计的实验变种进行尝试和鉴定。当团队审查场景时，口头的表述提供了一种测试模型的快速方式，因为耳朵能够快速地发现表述中的明确性、简易性和不协调的部分。</p>
<p>&nbsp;</p>
<p>头脑风暴和大量实验的创造力使得我们能创建一个知识丰富的模型并进行提炼，基于模型的语言以及实现的反馈循环中的约束则提供了支持。这种知识消化(knowledge crunching)过程将团队的知识转化为有价值的模型。</p>
          <br/>
          <span style="color:red;">
            <a href="http://agio.javaeye.com/blog/211914#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Jul 2008 19:43:45 +0800</pubDate>
        <link>http://agio.javaeye.com/blog/211914</link>
        <guid>http://agio.javaeye.com/blog/211914</guid>
      </item>
      <item>
        <title>用例的编写</title>
        <author>jokermanager</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://agio.javaeye.com">jokermanager</a>&nbsp;
          链接：<a href="http://agio.javaeye.com/blog/211913" style="color:red;">http://agio.javaeye.com/blog/211913</a>&nbsp;
          发表时间: 2008年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1、用例、UML图等保证不会是完美的。它们可能会遗漏关键信息或者包含错误陈述。解决方案并不是以瀑布的态度试图近乎完美地记录规格说明并且在开始阶段就完成此项工作。</p>
<p>&nbsp;</p>
<p>2、编写用例的折中方案是介于瀑布和即兴编程之间的迭代和进化式开发。</p>
<p>&nbsp;</p>
<p>3、以增量式进化、验证用例和其他模型，并且通过及早的编程和测试加以明确。</p>
<p>&nbsp;</p>
<p>4、如果在第一次开发迭代之前，小组就视图详尽地编写所有或大部分用例时，此时要意识到你已经走入歧途了。反之，则恭喜你！</p>
          <br/>
          <span style="color:red;">
            <a href="http://agio.javaeye.com/blog/211913#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Jul 2008 19:36:16 +0800</pubDate>
        <link>http://agio.javaeye.com/blog/211913</link>
        <guid>http://agio.javaeye.com/blog/211913</guid>
      </item>
      <item>
        <title>JDK5新特性--java.util.concurrent ExecutorCompletionSe</title>
        <author>jokermanager</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://agio.javaeye.com">jokermanager</a>&nbsp;
          链接：<a href="http://agio.javaeye.com/blog/211385" style="color:red;">http://agio.javaeye.com/blog/211385</a>&nbsp;
          发表时间: 2008年07月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="entry">
<p><span class="first-letter">考</span>
虑以下场景：浏览网页时，浏览器了5个线程下载网页中的图片文件，由于图片大小、网站访问速度等诸多因素的影响，完成图片下载的时间就会有很大的不同。如果先下载完成的图片就会被先显示到界面上，反之，后下载的图片就后显示。</p>
<p>Java的<a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html" target="_blank">并发库</a>
的<a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CompletionService.html" target="_blank">CompletionService</a>
可
以满足这种场景要求。该接口有两个重要方法：submit()和take()。submit用于提交一个runnable或者callable，一般会提
交给一个线程池处理；而take就是取出已经执行完毕runnable或者callable实例的Future对象，如果没有满足要求的，就等待了。
CompletionService还有一个对应的方法poll，该方法与take类似，只是不会等待，如果没有满足要求，就返回null对象。</p>
<div class="java">
<table border="0">
<tbody>
<tr>
<td align="left" valign="top">
    <code>
<span style="color: #7f0055;"><strong>package&nbsp;</strong>
</span>
<span style="color: #000000;">concurrent;</span>
<br />
<br />
<span style="color: #7f0055;"><strong>import&nbsp;</strong>
</span>
<span style="color: #000000;">java.util.concurrent.Callable;</span>
<br />
<span style="color: #7f0055;"><strong>import&nbsp;</strong>
</span>
<span style="color: #000000;">java.util.concurrent.CompletionService;</span>
<br />
<span style="color: #7f0055;"><strong>import&nbsp;</strong>
</span>
<span style="color: #000000;">java.util.concurrent.ExecutionException;</span>
<br />
<span style="color: #7f0055;"><strong>import&nbsp;</strong>
</span>
<span style="color: #000000;">java.util.concurrent.ExecutorCompletionService;</span>
<br />
<span style="color: #7f0055;"><strong>import&nbsp;</strong>
</span>
<span style="color: #000000;">java.util.concurrent.ExecutorService;</span>
<br />
<span style="color: #7f0055;"><strong>import&nbsp;</strong>
</span>
<span style="color: #000000;">java.util.concurrent.Executors;</span>
<br />
<span style="color: #7f0055;"><strong>import&nbsp;</strong>
</span>
<span style="color: #000000;">java.util.concurrent.Future;</span>
<br />
<br />
<span style="color: #7f0055;"><strong>public&nbsp;class&nbsp;</strong>
</span>
<span style="color: #000000;">TestCompletionService&nbsp;</span>
<span style="color: #000000;">{</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>public&nbsp;static&nbsp;</strong>
</span>
<span style="color: #7f0055;"><strong>void&nbsp;</strong>
</span>
<span style="color: #000000;">main</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">String</span>
<span style="color: #000000;">[]&nbsp;</span>
<span style="color: #000000;">args</span>
<span style="color: #000000;">)&nbsp;</span>
<span style="color: #7f0055;"><strong>throws&nbsp;</strong>
</span>
<span style="color: #000000;">InterruptedException,</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">ExecutionException&nbsp;</span>
<span style="color: #000000;">{</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">ExecutorService&nbsp;exec&nbsp;=&nbsp;Executors.newFixedThreadPool</span>
<span style="color: #000000;">(</span>
<span style="color: #990000;">10</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">CompletionService&lt;String&gt;&nbsp;serv&nbsp;=&nbsp;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>new&nbsp;</strong>
</span>
<span style="color: #000000;">ExecutorCompletionService&lt;String&gt;</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">exec</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>for&nbsp;</strong>
</span>
<span style="color: #000000;">(</span>
<span style="color: #7f0055;"><strong>int&nbsp;</strong>
</span>
<span style="color: #000000;">index&nbsp;=&nbsp;</span>
<span style="color: #990000;">0</span>
<span style="color: #000000;">;&nbsp;index&nbsp;&lt;&nbsp;</span>
<span style="color: #990000;">5</span>
<span style="color: #000000;">;&nbsp;index++</span>
<span style="color: #000000;">)&nbsp;{</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>final&nbsp;</strong>
</span>
<span style="color: #7f0055;"><strong>int&nbsp;</strong>
</span>
<span style="color: #000000;">NO&nbsp;=&nbsp;index;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">Callable&lt;String&gt;&nbsp;downImg&nbsp;=&nbsp;</span>
<span style="color: #7f0055;"><strong>new&nbsp;</strong>
</span>
<span style="color: #000000;">Callable&lt;String&gt;</span>
<span style="color: #000000;">()&nbsp;{</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>public&nbsp;</strong>
</span>
<span style="color: #000000;">String&nbsp;call</span>
<span style="color: #000000;">()&nbsp;</span>
<span style="color: #7f0055;"><strong>throws&nbsp;</strong>
</span>
<span style="color: #000000;">Exception&nbsp;</span>
<span style="color: #000000;">{</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">Thread.sleep</span>
<span style="color: #000000;">((</span>
<span style="color: #7f0055;"><strong>long</strong>
</span>
<span style="color: #000000;">)&nbsp;(</span>
<span style="color: #000000;">Math.random</span>
<span style="color: #000000;">()&nbsp;</span>
<span style="color: #000000;">*&nbsp;</span>
<span style="color: #990000;">10000</span>
<span style="color: #000000;">))</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>return&nbsp;</strong>
</span>
<span style="color: #2a00ff;">&quot;Downloaded&nbsp;Image&nbsp;&quot;&nbsp;</span>
<span style="color: #000000;">+&nbsp;NO;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">}</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">}</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">serv.submit</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">downImg</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">}</span>
<br />
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">Thread.sleep</span>
<span style="color: #000000;">(</span>
<span style="color: #990000;">1000&nbsp;</span>
<span style="color: #000000;">*&nbsp;</span>
<span style="color: #990000;">2</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">System.out.println</span>
<span style="color: #000000;">(</span>
<span style="color: #2a00ff;">&quot;Show&nbsp;web&nbsp;content&quot;</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>for&nbsp;</strong>
</span>
<span style="color: #000000;">(</span>
<span style="color: #7f0055;"><strong>int&nbsp;</strong>
</span>
<span style="color: #000000;">index&nbsp;=&nbsp;</span>
<span style="color: #990000;">0</span>
<span style="color: #000000;">;&nbsp;index&nbsp;&lt;&nbsp;</span>
<span style="color: #990000;">5</span>
<span style="color: #000000;">;&nbsp;index++</span>
<span style="color: #000000;">)&nbsp;{</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">Future&lt;String&gt;&nbsp;task&nbsp;=&nbsp;serv.take</span>
<span style="color: #000000;">()</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">String&nbsp;img&nbsp;=&nbsp;task.get</span>
<span style="color: #000000;">()</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">System.out.println</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">img</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">}</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">System.out.println</span>
<span style="color: #000000;">(</span>
<span style="color: #2a00ff;">&quot;End&quot;</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #3f7f5f;">//&nbsp;关闭线程池</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">exec.shutdown</span>
<span style="color: #000000;">()</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;</span>
<span style="color: #000000;">}</span>
<br />
<span style="color: #000000;">}</span>
</code>
</td>
</tr>
</tbody>
</table>
</div>
<p>运行结果:<br />
Show web content<br />
Downloaded Image 1<br />
Downloaded Image 2<br />
Downloaded Image 4<br />
Downloaded Image 0<br />
Downloaded Image 3<br />
End</p>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://agio.javaeye.com/blog/211385#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 Jul 2008 10:25:56 +0800</pubDate>
        <link>http://agio.javaeye.com/blog/211385</link>
        <guid>http://agio.javaeye.com/blog/211385</guid>
      </item>
      <item>
        <title>JDK5新特性--java.util.concurrent CyclicBarrier(3)</title>
        <author>jokermanager</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://agio.javaeye.com">jokermanager</a>&nbsp;
          链接：<a href="http://agio.javaeye.com/blog/211097" style="color:red;">http://agio.javaeye.com/blog/211097</a>&nbsp;
          发表时间: 2008年07月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span class="first-letter">在</span>
实际应用中，有时候需要多个线程同时工作以完成同一件事情，而且在完成过程中，往往会等待其他线程都完成某一阶段后再执行，等所有线程都到达某一个阶段后再统一执行。</p>
<p>比如有几个旅行团需要途经深圳、广州、韶关、长沙最后到达武汉。旅行团中有自驾游的，有徒步的，有乘坐旅游大巴的；这些旅行团同时出发，并且每到一个目的地，都要等待其他旅行团到达此地后再同时出发，直到都到达终点站武汉。</p>
<p>这时候<a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.html" target="_blank">CyclicBarrier</a>
就可以派上用场。CyclicBarrier最重要的属性就是参与者个数，另外最要方法是await()。当所有线程都调用了await()后，就表示这些线程都可以继续执行，否则就会等待。</p>
<div class="java">
<table border="0">
<tbody>
<tr>
<td align="left" valign="top">
    <code>
<span style="color: #7f0055;"><strong>package&nbsp;</strong>
</span>
<span style="color: #000000;">concurrent;</span>
<br />
<span style="color: #7f0055;"><strong>import&nbsp;</strong>
</span>
<span style="color: #000000;">java.text.SimpleDateFormat;</span>
<br />
<span style="color: #7f0055;"><strong>import&nbsp;</strong>
</span>
<span style="color: #000000;">java.util.Date;</span>
<br />
<span style="color: #7f0055;"><strong>import&nbsp;</strong>
</span>
<span style="color: #000000;">java.util.concurrent.BrokenBarrierException;</span>
<br />
<span style="color: #7f0055;"><strong>import&nbsp;</strong>
</span>
<span style="color: #000000;">java.util.concurrent.CyclicBarrier;</span>
<br />
<span style="color: #7f0055;"><strong>import&nbsp;</strong>
</span>
<span style="color: #000000;">java.util.concurrent.ExecutorService;</span>
<br />
<span style="color: #7f0055;"><strong>import&nbsp;</strong>
</span>
<span style="color: #000000;">java.util.concurrent.Executors;</span>
<br />
<span style="color: #7f0055;"><strong>public&nbsp;class&nbsp;</strong>
</span>
<span style="color: #000000;">TestCyclicBarrier&nbsp;</span>
<span style="color: #000000;">{</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;</span>
<span style="color: #3f7f5f;">//&nbsp;徒步需要的时间:&nbsp;Shenzhen,&nbsp;Guangzhou,&nbsp;Shaoguan,&nbsp;Changsha,&nbsp;Wuhan</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>private&nbsp;static&nbsp;</strong>
</span>
<span style="color: #7f0055;"><strong>int</strong>
</span>
<span style="color: #000000;">[]&nbsp;</span>
<span style="color: #000000;">timeWalk&nbsp;=&nbsp;</span>
<span style="color: #000000;">{&nbsp;</span>
<span style="color: #990000;">5</span>
<span style="color: #000000;">,&nbsp;</span>
<span style="color: #990000;">8</span>
<span style="color: #000000;">,&nbsp;</span>
<span style="color: #990000;">15</span>
<span style="color: #000000;">,&nbsp;</span>
<span style="color: #990000;">15</span>
<span style="color: #000000;">,&nbsp;</span>
<span style="color: #990000;">10&nbsp;</span>
<span style="color: #000000;">}</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;</span>
<span style="color: #3f7f5f;">//&nbsp;自驾游</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>private&nbsp;static&nbsp;</strong>
</span>
<span style="color: #7f0055;"><strong>int</strong>
</span>
<span style="color: #000000;">[]&nbsp;</span>
<span style="color: #000000;">timeSelf&nbsp;=&nbsp;</span>
<span style="color: #000000;">{&nbsp;</span>
<span style="color: #990000;">1</span>
<span style="color: #000000;">,&nbsp;</span>
<span style="color: #990000;">3</span>
<span style="color: #000000;">,&nbsp;</span>
<span style="color: #990000;">4</span>
<span style="color: #000000;">,&nbsp;</span>
<span style="color: #990000;">4</span>
<span style="color: #000000;">,&nbsp;</span>
<span style="color: #990000;">5&nbsp;</span>
<span style="color: #000000;">}</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;</span>
<span style="color: #3f7f5f;">//&nbsp;旅游大巴</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>private&nbsp;static&nbsp;</strong>
</span>
<span style="color: #7f0055;"><strong>int</strong>
</span>
<span style="color: #000000;">[]&nbsp;</span>
<span style="color: #000000;">timeBus&nbsp;=&nbsp;</span>
<span style="color: #000000;">{&nbsp;</span>
<span style="color: #990000;">2</span>
<span style="color: #000000;">,&nbsp;</span>
<span style="color: #990000;">4</span>
<span style="color: #000000;">,&nbsp;</span>
<span style="color: #990000;">6</span>
<span style="color: #000000;">,&nbsp;</span>
<span style="color: #990000;">6</span>
<span style="color: #000000;">,&nbsp;</span>
<span style="color: #990000;">7&nbsp;</span>
<span style="color: #000000;">}</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>static&nbsp;</strong>
</span>
<span style="color: #000000;">String&nbsp;now</span>
<span style="color: #000000;">()&nbsp;{</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">SimpleDateFormat&nbsp;sdf&nbsp;=&nbsp;</span>
<span style="color: #7f0055;"><strong>new&nbsp;</strong>
</span>
<span style="color: #000000;">SimpleDateFormat</span>
<span style="color: #000000;">(</span>
<span style="color: #2a00ff;">&quot;HH:mm:ss&quot;</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>return&nbsp;</strong>
</span>
<span style="color: #000000;">sdf.format</span>
<span style="color: #000000;">(</span>
<span style="color: #7f0055;"><strong>new&nbsp;</strong>
</span>
<span style="color: #000000;">Date</span>
<span style="color: #000000;">())&nbsp;</span>
<span style="color: #000000;">+&nbsp;</span>
<span style="color: #2a00ff;">&quot;:&nbsp;&quot;</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;</span>
<span style="color: #000000;">}</span>
<br />
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>static&nbsp;class&nbsp;</strong>
</span>
<span style="color: #000000;">Tour&nbsp;</span>
<span style="color: #7f0055;"><strong>implements&nbsp;</strong>
</span>
<span style="color: #000000;">Runnable&nbsp;</span>
<span style="color: #000000;">{</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>private&nbsp;</strong>
</span>
<span style="color: #7f0055;"><strong>int</strong>
</span>
<span style="color: #000000;">[]&nbsp;</span>
<span style="color: #000000;">times;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>private&nbsp;</strong>
</span>
<span style="color: #000000;">CyclicBarrier&nbsp;barrier;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>private&nbsp;</strong>
</span>
<span style="color: #000000;">String&nbsp;tourName;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>public&nbsp;</strong>
</span>
<span style="color: #000000;">Tour</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">CyclicBarrier&nbsp;barrier,&nbsp;String&nbsp;tourName,&nbsp;</span>
<span style="color: #7f0055;"><strong>int</strong>
</span>
<span style="color: #000000;">[]&nbsp;</span>
<span style="color: #000000;">times</span>
<span style="color: #000000;">)&nbsp;{</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>this</strong>
</span>
<span style="color: #000000;">.times&nbsp;=&nbsp;times;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>this</strong>
</span>
<span style="color: #000000;">.tourName&nbsp;=&nbsp;tourName;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>this</strong>
</span>
<span style="color: #000000;">.barrier&nbsp;=&nbsp;barrier;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">}</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>public&nbsp;</strong>
</span>
<span style="color: #7f0055;"><strong>void&nbsp;</strong>
</span>
<span style="color: #000000;">run</span>
<span style="color: #000000;">()&nbsp;{</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>try&nbsp;</strong>
</span>
<span style="color: #000000;">{</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">Thread.sleep</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">times</span>
<span style="color: #000000;">[</span>
<span style="color: #990000;">0</span>
<span style="color: #000000;">]&nbsp;</span>
<span style="color: #000000;">*&nbsp;</span>
<span style="color: #990000;">1000</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">System.out.println</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">now</span>
<span style="color: #000000;">()&nbsp;</span>
<span style="color: #000000;">+&nbsp;tourName&nbsp;+&nbsp;</span>
<span style="color: #2a00ff;">&quot;&nbsp;Reached&nbsp;Shenzhen&quot;</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">barrier.await</span>
<span style="color: #000000;">()</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">Thread.sleep</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">times</span>
<span style="color: #000000;">[</span>
<span style="color: #990000;">1</span>
<span style="color: #000000;">]&nbsp;</span>
<span style="color: #000000;">*&nbsp;</span>
<span style="color: #990000;">1000</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">System.out.println</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">now</span>
<span style="color: #000000;">()&nbsp;</span>
<span style="color: #000000;">+&nbsp;tourName&nbsp;+&nbsp;</span>
<span style="color: #2a00ff;">&quot;&nbsp;Reached&nbsp;Guangzhou&quot;</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">barrier.await</span>
<span style="color: #000000;">()</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">Thread.sleep</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">times</span>
<span style="color: #000000;">[</span>
<span style="color: #990000;">2</span>
<span style="color: #000000;">]&nbsp;</span>
<span style="color: #000000;">*&nbsp;</span>
<span style="color: #990000;">1000</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">System.out.println</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">now</span>
<span style="color: #000000;">()&nbsp;</span>
<span style="color: #000000;">+&nbsp;tourName&nbsp;+&nbsp;</span>
<span style="color: #2a00ff;">&quot;&nbsp;Reached&nbsp;Shaoguan&quot;</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">barrier.await</span>
<span style="color: #000000;">()</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">Thread.sleep</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">times</span>
<span style="color: #000000;">[</span>
<span style="color: #990000;">3</span>
<span style="color: #000000;">]&nbsp;</span>
<span style="color: #000000;">*&nbsp;</span>
<span style="color: #990000;">1000</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">System.out.println</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">now</span>
<span style="color: #000000;">()&nbsp;</span>
<span style="color: #000000;">+&nbsp;tourName&nbsp;+&nbsp;</span>
<span style="color: #2a00ff;">&quot;&nbsp;Reached&nbsp;Changsha&quot;</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">barrier.await</span>
<span style="color: #000000;">()</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">Thread.sleep</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">times</span>
<span style="color: #000000;">[</span>
<span style="color: #990000;">4</span>
<span style="color: #000000;">]&nbsp;</span>
<span style="color: #000000;">*&nbsp;</span>
<span style="color: #990000;">1000</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">System.out.println</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">now</span>
<span style="color: #000000;">()&nbsp;</span>
<span style="color: #000000;">+&nbsp;tourName&nbsp;+&nbsp;</span>
<span style="color: #2a00ff;">&quot;&nbsp;Reached&nbsp;Wuhan&quot;</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">barrier.await</span>
<span style="color: #000000;">()</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">}&nbsp;</span>
<span style="color: #7f0055;"><strong>catch&nbsp;</strong>
</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">InterruptedException&nbsp;e</span>
<span style="color: #000000;">)&nbsp;{</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">}&nbsp;</span>
<span style="color: #7f0055;"><strong>catch&nbsp;</strong>
</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">BrokenBarrierException&nbsp;e</span>
<span style="color: #000000;">)&nbsp;{</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">}</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">}</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;</span>
<span style="color: #000000;">}</span>
<br />
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;</span>
<span style="color: #7f0055;"><strong>public&nbsp;static&nbsp;</strong>
</span>
<span style="color: #7f0055;"><strong>void&nbsp;</strong>
</span>
<span style="color: #000000;">main</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">String</span>
<span style="color: #000000;">[]&nbsp;</span>
<span style="color: #000000;">args</span>
<span style="color: #000000;">)&nbsp;{</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #3f7f5f;">//&nbsp;三个旅行团</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">CyclicBarrier&nbsp;barrier&nbsp;=&nbsp;</span>
<span style="color: #7f0055;"><strong>new&nbsp;</strong>
</span>
<span style="color: #000000;">CyclicBarrier</span>
<span style="color: #000000;">(</span>
<span style="color: #990000;">3</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">ExecutorService&nbsp;exec&nbsp;=&nbsp;Executors.newFixedThreadPool</span>
<span style="color: #000000;">(</span>
<span style="color: #990000;">3</span>
<span style="color: #000000;">)</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">exec.submit</span>
<span style="color: #000000;">(</span>
<span style="color: #7f0055;"><strong>new&nbsp;</strong>
</span>
<span style="color: #000000;">Tour</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">barrier,&nbsp;</span>
<span style="color: #2a00ff;">&quot;WalkTour&quot;</span>
<span style="color: #000000;">,&nbsp;timeWalk</span>
<span style="color: #000000;">))</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">exec.submit</span>
<span style="color: #000000;">(</span>
<span style="color: #7f0055;"><strong>new&nbsp;</strong>
</span>
<span style="color: #000000;">Tour</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">barrier,&nbsp;</span>
<span style="color: #2a00ff;">&quot;SelfTour&quot;</span>
<span style="color: #000000;">,&nbsp;timeSelf</span>
<span style="color: #000000;">))</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">exec.submit</span>
<span style="color: #000000;">(</span>
<span style="color: #7f0055;"><strong>new&nbsp;</strong>
</span>
<span style="color: #000000;">Tour</span>
<span style="color: #000000;">(</span>
<span style="color: #000000;">barrier,&nbsp;</span>
<span style="color: #2a00ff;">&quot;BusTour&quot;</span>
<span style="color: #000000;">,&nbsp;timeBus</span>
<span style="color: #000000;">))</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #000000;">exec.shutdown</span>
<span style="color: #000000;">()</span>
<span style="color: #000000;">;</span>
<br />
<span style="color: #ffffff;">&nbsp;&nbsp;</span>
<span style="color: #000000;">}</span>
<br />
<span style="color: #000000;">}</span>
</code>
   </td>
</tr>
</tbody>
</table>
</div>
<p>
运行结果：<br />
00:02:25: SelfTour Reached Shenzhen<br />
00:02:25: BusTour Reached Shenzhen<br />
00:02:27: WalkTour Reached Shenzhen<br />
00:02:30: SelfTour Reached Guangzhou<br />
00:02:31: BusTour Reached Guangzhou<br />
00:02:35: WalkTour Reached Guangzhou<br />
00:02:39: SelfTour Reached Shaoguan<br />
00:02:41: BusTour Reached Shaoguan</p>
          <br/>
          <span style="color:red;">
            <a href="http://agio.javaeye.com/blog/211097#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Jul 2008 15:13:33 +0800</pubDate>
        <link>http://agio.javaeye.com/blog/211097</link>
        <guid>http://agio.javaeye.com/blog/211097</guid>
      </item>
      <item>
        <title>java基础－－Java 5.0多线程编程（3）</title>
        <author>jokermanager</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://agio.javaeye.com">jokermanager</a>&nbsp;
          链接：<a href="http://agio.javaeye.com/blog/211076" style="color:red;">http://agio.javaeye.com/blog/211076</a>&nbsp;
          发表时间: 2008年07月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span class="a14c" id="zoom">
<p class="MsoNormal"><strong><span style="font-size: 12pt;">Lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">接口</span>
</strong>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">ReentrantLock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">是</span>
<span style="font-size: 12pt;">Lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">的具体类，</span>
<span style="font-size: 12pt;">Lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">提供了以下一些方法：</span>
<span style="font-size: 12pt;"></span>
</p>
<ul type="disc" style="margin-top: 0cm;">
<li class="MsoNormal"><span style="font-size: 12pt;">lock(): </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">请求锁定，如果锁已被别的线程锁定，调用此方法的线程被阻断进入等待状态。</span>
<span style="font-size: 12pt;"></span>
 </li>
<li class="MsoNormal"><span style="font-size: 12pt;">tryLock()</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">：如果锁没被别的线程锁定，进入锁定状态，并返回</span>
<span style="font-size: 12pt;">true</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">。若锁已被锁定，返回</span>
<span style="font-size: 12pt;">false</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">，不进入等待状态。此方法还可带时间参数，如果锁在方法执行时已被锁定，线程将继续等待规定的时间，若还不行才返回</span>
<span style="font-size: 12pt;">false</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">。</span>
<span style="font-size: 12pt;"></span>
 </li>
<li class="MsoNormal"><span style="font-size: 12pt;">unlock()</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">：取消锁定，需要注意的是</span>
<span style="font-size: 12pt;">Lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">不会自动取消，编程时必须手动解锁。</span>
<span style="font-size: 12pt;"></span>
 </li>
</ul>
<p class="MsoNormal"><span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">代码：</span>
<span style="font-size: 12pt;"></span>
</p>
<table cellspacing="0" border="1" cellpadding="0" style="border-style: none; border-collapse: collapse;">
<tbody>
<tr>
<td valign="top" width="568" style="border: 0.5pt solid windowtext; padding: 0cm 5.4pt; width: 426.1pt;">
<p class="MsoNormal"><span style="font-size: 12pt;">//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">生成一个锁</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">Lock lock = new ReentrantLock();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">public void accessProtectedResource() {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp; </span>
lock.lock(); //</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">取得锁定</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp; </span>
try {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp; </span>
//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">对共享资源进行操作</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp; </span>
} finally {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp; </span>
//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">一定记着把锁取消掉，锁本身是不会自动解锁的</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp; </span>
lock.unlock();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">}</span>
</p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><strong><span style="font-size: 12pt;">ReadWriteLock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">接口</span>
</strong>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp; 为了提高效率有些共享资源允许同时进行多个读的操作，但只允许一个写的操作，比如一个文件，只要其内容不变可以让多个线程同时读，不必做排他的锁定，排他的锁定只有在写的时候需要，以保证别的线程不会看到数据不完整的文件。</span>
<span style="font-size: 12pt;">ReadWriteLock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">可满足这种需要。</span>
<span style="font-size: 12pt;">ReadWriteLock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">内置两个</span>
<span style="font-size: 12pt;">Lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">，一个是读的</span>
<span style="font-size: 12pt;">Lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">，一个是写的</span>
<span style="font-size: 12pt;">Lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">。多个线程可同时得到读的</span>
<span style="font-size: 12pt;">Lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">，但只有一个线程能得到写的</span>
<span style="font-size: 12pt;">Lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">，而且写的</span>
<span style="font-size: 12pt;">Lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">被锁定后，任何线程都不能得到</span>
<span style="font-size: 12pt;">Lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">。</span>
<span style="font-size: 12pt;">ReadWriteLock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">提供的方法有：</span>
<span style="font-size: 12pt;"></span>
</p>
<ul type="disc" style="margin-top: 0cm;">
<li class="MsoNormal"><span style="font-size: 12pt;">readLock(): </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">返回一个读的</span>
<span style="font-size: 12pt;">lock</span>
 </li>
<li class="MsoNormal"><span style="font-size: 12pt;">writeLock(): </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">返回一个写的</span>
<span style="font-size: 12pt;">lock, </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">此</span>
<span style="font-size: 12pt;">lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">是排他的。</span>
<span style="font-size: 12pt;"></span>
 </li>
</ul>
<p class="MsoNormal"><span style="font-size: 12pt;">ReadWriteLock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">的例子：</span>
<span style="font-size: 12pt;"></span>
</p>
<table cellspacing="0" border="1" cellpadding="0" style="border-style: none; border-collapse: collapse;">
<tbody>
<tr>
<td valign="top" width="568" style="border: 0.5pt solid windowtext; padding: 0cm 5.4pt; width: 426.1pt;">
<p class="MsoNormal"><span style="font-size: 12pt;">public class FileOperator{</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">初始化一个</span>
<span style="font-size: 12pt;">ReadWriteLock</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
ReadWriteLock lock = new ReentrantReadWriteLock();</span>
</p>
<p class="MsoNormal" style="text-indent: 29.25pt;"><span style="font-size: 12pt;">public String read() { </span>
</p>
<p class="MsoNormal" style="text-indent: 29.25pt;"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">得到</span>
<span style="font-size: 12pt;">readLock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">并锁定</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
Lock readLock = lock.readLock();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
readLock.lock();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
try {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">做读的工作</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
return &quot;Read something&quot;;</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
} finally {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
readLock.unlock(); </span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
} </span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</p>
<p class="MsoNormal" style="text-indent: 29.25pt;"><span style="font-size: 12pt;">public void write(String content) {</span>
</p>
<p class="MsoNormal" style="text-indent: 29.25pt;"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">得到</span>
<span style="font-size: 12pt;">writeLock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">并锁定</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
Lock writeLock = lock.writeLock();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
writeLock.lock();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
try {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">做读的工作</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
} finally {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
writeLock.unlock(); </span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
} </span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">}</span>
</p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="font-size: 11pt;">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp; 需要注意的是</span>
<span style="font-size: 12pt;">ReadWriteLock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">提供了一个高效的锁定机理，但最终程序的运行效率是和程序的设计息息相关的，比如说如果读的线程和写的线程同时在等待，要考虑是先发放读的</span>
<span style="font-size: 12pt;">lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">还是先发放写的</span>
<span style="font-size: 12pt;">lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">。如果写发生的频率不高，而且快，可以考虑先给写的</span>
<span style="font-size: 12pt;">lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">。还要考虑的问题是如果一个写正在等待读完成，此时一个新的读进来，是否要给这个新的读发锁，如果发了，可能导致写的线程等很久。等等此类问题在编程时都要给予充分的考虑。</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><strong><span style="font-size: 12pt;">Condition</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">接口：</span>
</strong>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp; 有时候线程取得</span>
<span style="font-size: 12pt;">lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">后需要在一定条件下才能做某些工作，比如说经典的</span>
<span style="font-size: 12pt;">Producer</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">和</span>
<span style="font-size: 12pt;">Consumer</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">问题，</span>
<span style="font-size: 12pt;">Consumer</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">必须在篮子里有苹果的时候才能吃苹果，否则它必须暂时放弃对篮子的锁定，等到</span>
<span style="font-size: 12pt;">Producer</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">往篮子里放了苹果后再去拿来吃。而</span>
<span style="font-size: 12pt;">Producer</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">必须等到篮子空了才能往里放苹果，否则它也需要暂时解锁等</span>
<span style="font-size: 12pt;">Consumer</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">把苹果吃了才能往篮子里放苹果。在</span>
<span style="font-size: 12pt;">Java 5.0</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">以前，这种功能是由</span>
<span style="font-size: 12pt;">Object</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">类的</span>
<span style="font-size: 12pt;">wait(), notify()</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">和</span>
<span style="font-size: 12pt;">notifyAll()</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">等方法实现的，在</span>
<span style="font-size: 12pt;">5.0</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">里面，这些功能集中到了</span>
<span style="font-size: 12pt;">Condition</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">这个接口来实现，</span>
<span style="font-size: 12pt;">Condition</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">提供以下方法：</span>
<span style="font-size: 12pt;"></span>
</p>
<ul type="disc" style="margin-top: 0cm;">
<li class="MsoNormal"><span style="font-size: 12pt;">await()</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">：使调用此方法的线程放弃锁定，进入睡眠直到被打断或被唤醒。</span>
<span style="font-size: 12pt;"></span>
 </li>
<li class="MsoNormal"><span style="font-size: 12pt;">signal(): </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">唤醒一个等待的线程</span>
<span style="font-size: 12pt;"></span>
 </li>
<li class="MsoNormal"><span style="font-size: 12pt;">signalAll()</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">：唤醒所有等待的线程</span>
<span style="font-size: 12pt;"></span>
 </li>
</ul>
<p class="MsoNormal"><span style="font-size: 12pt;">Condition</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">的例子：</span>
<span style="font-size: 12pt;"></span>
</p>
<table cellspacing="0" border="1" cellpadding="0" style="border-style: none; border-collapse: collapse;">
<tbody>
<tr>
<td valign="top" width="568" style="border: 0.5pt solid windowtext; padding: 0cm 5.4pt; width: 426.1pt;">
<p class="MsoNormal"><span style="font-size: 12pt;">public class Basket {<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</p>
<p class="MsoNormal" style="text-indent: 24.75pt;"><span style="font-size: 12pt;">Lock lock = new ReentrantLock();</span>
</p>
<p class="MsoNormal" style="text-indent: 24.75pt;"><span style="font-size: 12pt;">//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">产生</span>
<span style="font-size: 12pt;">Condition</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">对象</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>
Condition produced = lock.newCondition();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>
Condition consumed = lock.newCondition();</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>
boolean available = false;</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp; </span>
<span>&nbsp;&nbsp;</span>
</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>
public void produce() throws InterruptedException {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
lock.lock();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
try {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
if(available){</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
consumed.await(); //</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">放弃</span>
<span style="font-size: 12pt;">lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">进入睡眠</span>
<span style="font-size: 12pt;"><span>&nbsp; </span>
</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
/*</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">生产苹果</span>
<span style="font-size: 12pt;">*/</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
System.out.println(&quot;Apple produced.&quot;);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
available = true;</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
produced.signal(); //</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">发信号唤醒等待这个</span>
<span style="font-size: 12pt;">Condition</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">的线程</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
} finally {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
lock.unlock();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>
public void consume() throws InterruptedException {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
lock.lock();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
try {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
if(!available){</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
produced.await();//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">放弃</span>
<span style="font-size: 12pt;">lock</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">进入睡眠</span>
<span style="font-size: 12pt;"><span>&nbsp; </span>
</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
/*</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">吃苹果</span>
<span style="font-size: 12pt;">*/</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
System.out.println(&quot;Apple consumed.&quot;);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
available = false;</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
consumed.signal();//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">发信号唤醒等待这个</span>
<span style="font-size: 12pt;">Condition</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">的线程</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
} finally {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
lock.unlock();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>
}<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">}</span>
</p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="font-size: 12pt;">ConditionTester:</span>
</p>
<table cellspacing="0" border="1" cellpadding="0" style="border-style: none; border-collapse: collapse;">
<tbody>
<tr>
<td valign="top" width="568" style="border: 0.5pt solid windowtext; padding: 0cm 5.4pt; width: 426.1pt;">
<p class="MsoNormal"><span style="font-size: 12pt;">public class ConditionTester {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
public static void main(String[] args) throws InterruptedException{</span>
</p>
<p class="MsoNormal" style="text-indent: 59.25pt;"><span style="font-size: 12pt;">final Basket basket = new Basket();</span>
</p>
<p class="MsoNormal" style="text-indent: 59.25pt;"><span style="font-size: 12pt;">//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">定义一个</span>
<span style="font-size: 12pt;">producer</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
Runnable producer = new Runnable() {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
public void run() {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
try {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
basket.produce();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
} catch (InterruptedException ex) {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
ex.printStackTrace();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal" style="text-indent: 59.25pt;"><span style="font-size: 12pt;">};</span>
</p>
<p class="MsoNormal" style="text-indent: 59.25pt;"><span style="font-size: 12pt;">//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">定义一个</span>
<span style="font-size: 12pt;">consumer</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
Runnable consumer = new Runnable() {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
public void run() {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
try {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
basket.consume();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
} catch (InterruptedException ex) {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
ex.printStackTrace();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal" style="text-indent: 59.25pt;"><span style="font-size: 12pt;">};</span>
</p>
<p class="MsoNormal" style="text-indent: 59.25pt;"><span style="font-size: 12pt;">//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">各产生</span>
<span style="font-size: 12pt;">10</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">个</span>
<span style="font-size: 12pt;">consumer</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">和</span>
<span style="font-size: 12pt;">producer</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
ExecutorService service = Executors.newCachedThreadPool();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
for(int i=0; i &lt; 10; i++)</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
service.submit(consumer);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
Thread.sleep(2000);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
for(int i=0; i&lt;10; i++)</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
service.submit(producer);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
service.shutdown();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">}</span>
</p>
</td>
</tr>
</tbody>
</table>
<h3>5: Synchronizer<span lang="ZH-CN" style="font-family: 宋体;">：同步装置</span>
</h3>
<p class="MsoNormal"><span style="font-size: 12pt;">&nbsp;&nbsp; Java 5.0</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">里新加了</span>
<span style="font-size: 12pt;">4</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">个协调线程间进程的同步装置，它们分别是</span>
<span style="font-size: 12pt;">Semaphore, CountDownLatch, CyclicBarrier</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">和</span>
<span style="font-size: 12pt;">Exchanger.</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><strong>Semaphore:</strong>
</span>
</p>
<p class="MsoNormal"><span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp; 用来管理一个资源池的工具，</span>
<span style="font-size: 12pt;">Semaphore</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">可以看成是个通行证，线程要想从资源池拿到资源必须先拿到通行证，</span>
<span style="font-size: 12pt;">Semaphore</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">提供的通行证数量和资源池的大小一致。如果线程暂时拿不到通行证，线程就会被阻断进入等待状态。以下是一个例子：</span>
<span style="font-size: 12pt;"></span>
</p>
<table cellspacing="0" border="1" cellpadding="0" style="border-style: none; border-collapse: collapse;">
<tbody>
<tr>
<td valign="top" width="568" style="border: 0.5pt solid windowtext; padding: 0cm 5.4pt; width: 426.1pt;">
<p class="MsoNormal"><span style="font-size: 12pt;">public class Pool {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp; </span>
<span>&nbsp;&nbsp;</span>
ArrayList pool = null;</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
Semaphore pass = null;</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
public Pool(int size){</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">初始化资源池</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
pool = new ArrayList();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
for(int i=0; i</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
pool.add(&quot;Resource &quot;+i);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp; </span>
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
//Semaphore</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">的大小和资源池的大小一致</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
pass = new Semaphore(size);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
public String get() throws InterruptedException{</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">获取通行证</span>
<span style="font-size: 12pt;">,</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">只有得到通行证后才能得到资源</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
pass.acquire();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
return getResource();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
public void put(String resource){</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">归还通行证，并归还资源</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
pass.release();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
releaseResource(resource);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>
private synchronized String getResource() {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
String result = pool.get(0);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
pool.remove(0);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
System.out.println(&quot;Give out &quot;+result);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
return result;</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
private synchronized void releaseResource(String resource) {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
System.out.println(&quot;return &quot;+resource);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
pool.add(resource);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
} </span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">}</span>
</p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="font-size: 12pt;">SemaphoreTest:</span>
</p>
<table cellspacing="0" border="1" cellpadding="0" style="border-style: none; border-collapse: collapse;">
<tbody>
<tr>
<td valign="top" width="568" style="border: 0.5pt solid windowtext; padding: 0cm 5.4pt; width: 426.1pt;">
<p class="MsoNormal"><span style="font-size: 12pt;">public class SemaphoreTest {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
public static void main(String[] args){</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
final Pool aPool = new Pool(2);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
Runnable worker = new Runnable() {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
public void run() {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
String resource = null;</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
try {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">取得</span>
<span style="font-size: 12pt;">resource</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
resource = aPool.get();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
} catch (InterruptedException ex) {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
ex.printStackTrace();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">用</span>
<span style="font-size: 12pt;">resource</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">做工作</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
System.out.println(&quot;I worked on &quot;+resource);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
//</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">归还</span>
<span style="font-size: 12pt;">resource</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
aPool.put(resource);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
};</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
ExecutorService service = Executors.newCachedThreadPool();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
for(int i=0; i&lt;20; i++){</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
service.submit(worker);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
service.shutdown();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">}</span>
</p>
</td>
</tr>
</tbody>
</table>
<p align="center">&nbsp;</p>
</span>
                    <span>
<p align="center">&nbsp;</p>
</span>
</p>
          <br/>
          <span style="color:red;">
            <a href="http://agio.javaeye.com/blog/211076#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Jul 2008 14:35:54 +0800</pubDate>
        <link>http://agio.javaeye.com/blog/211076</link>
        <guid>http://agio.javaeye.com/blog/211076</guid>
      </item>
      <item>
        <title>java基础－－Java 5.0多线程编程（2） </title>
        <author>jokermanager</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://agio.javaeye.com">jokermanager</a>&nbsp;
          链接：<a href="http://agio.javaeye.com/blog/211073" style="color:red;">http://agio.javaeye.com/blog/211073</a>&nbsp;
          发表时间: 2008年07月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span class="a14c" id="zoom">
<p class="MsoNormal"><span style="font-size: 12pt;">*1: </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">定义了几个任务</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">*2: </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">初始了任务执行工具。任务的执行框架将会在后面解释。</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">*3: </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">执行任务，任务启动时返回了一个</span>
<span style="font-size: 12pt;">Future</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">对象，如果想得到任务执行的结果或者是异常可对这个</span>
<span style="font-size: 12pt;">Future</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">对象进行操作。</span>
<span style="font-size: 12pt;">Future</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">所含的值必须跟</span>
<span style="font-size: 12pt;">Callable</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">所含的值对映，比如说例子中</span>
<span style="font-size: 12pt;">Future</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">对印</span>
<span style="font-size: 12pt;">Callable</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">*4: </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">任务</span>
<span style="font-size: 12pt;">1</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">正常执行完毕，</span>
<span style="font-size: 12pt;">future1.get()</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">会返回线程的值</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">*5: </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">任务</span>
<span style="font-size: 12pt;">2</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">在进行一个死循环，调用</span>
<span style="font-size: 12pt;">future2.cancel(true)</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">来中止此线程。传入的参数标明是否可打断线程，</span>
<span style="font-size: 12pt;">true</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">表明可以打断。</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">*6: </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">任务</span>
<span style="font-size: 12pt;">3</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">抛出异常，调用</span>
<span style="font-size: 12pt;">future3.get()</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">时会引起异常的抛出。</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">&nbsp;</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">运行</span>
<span style="font-size: 12pt;">Executor</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">会有以下运行结果：</span>
<span style="font-size: 12pt;"></span>
</p>
<table cellspacing="0" border="1" cellpadding="0" style="border-style: none; border-collapse: collapse;">
<tbody>
<tr>
<td valign="top" width="568" style="border: 0.5pt solid windowtext; padding: 0cm 5.4pt; width: 426.1pt;">
<p class="MsoNormal"><span style="font-size: 12pt;">looping....</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">Task done. //*1</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">looping....</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">looping....//*2</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">looping....</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">looping....</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">looping....</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">looping....</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">Thread 2 terminated? :true //*3</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">//*4</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">java.util.concurrent.ExecutionException: java.lang.Exception: Callable terminated with Exception!</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:205)</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
at java.util.concurrent.FutureTask.get(FutureTask.java:80)</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
at concurrent.Executor.main(Executor.java:43)</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
&hellip;&hellip;.</span>
</p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="font-size: 12pt;">*1: </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">任务</span>
<span style="font-size: 12pt;">1</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">正常结束</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">*2: </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">任务</span>
<span style="font-size: 12pt;">2</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">是个死循环，这是它的打印结果</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">*3: </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">指示任务</span>
<span style="font-size: 12pt;">2</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">被取消</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">*4: </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">在执行</span>
<span style="font-size: 12pt;">future3.get()</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">时得到任务</span>
<span style="font-size: 12pt;">3</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">抛出的异常</span>
<span style="font-size: 12pt;"></span>
</p>
<h3>3<span lang="ZH-CN" style="font-family: 宋体;">：新的任务执行架构</span>
</h3>
<p class="MsoNormal"><span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp; 在</span>
<span style="font-size: 12pt;">Java 5.0</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">之前启动一个任务是通过调用</span>
<span style="font-size: 12pt;">Thread</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">类的</span>
<span style="font-size: 12pt;">start()</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">方法来实现的，任务的提于交和执行是同时进行的，如果你想对任务的执行进行调度或是控制同时执行的线程数量就需要额外编写代码来完成。</span>
<span style="font-size: 12pt;">5.0</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行，并且可以建立一个类似数据库连接池的线程池来执行任务。这个架构主要有三个接口和其相应的具体类组成。这三个接口是</span>
<span style="font-size: 12pt;">Executor, ExecutorService</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">和</span>
<span style="font-size: 12pt;">ScheduledExecutorService</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">，让我们先用一个图来显示它们的关系：</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">&nbsp; 图的左侧是接口，图的右侧是这些接口的具体类。注意</span>
<span style="font-size: 12pt;">Executor</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">是没有直接具体实现的。</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><strong><span style="font-size: 12pt;">Executor</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">接口：</span>
</strong>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">是用来执行</span>
<span style="font-size: 12pt;">Runnable</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">任务的，它只定义一个方法：</span>
<span style="font-size: 12pt;"></span>
</p>
<ul type="disc" style="margin-top: 0cm;">
<li class="MsoNormal"><span style="font-size: 12pt;">execute(Runnable command)</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">：执行</span>
<span style="font-size: 12pt;">Ruannable</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">类型的任务</span>
<span style="font-size: 12pt;"></span>
 </li>
</ul>
<p class="MsoNormal"><strong><span style="font-size: 12pt;">ExecutorService</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">接口：</span>
</strong>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">ExecutorService</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">继承了</span>
<span style="font-size: 12pt;">Executor</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">的方法，并提供了执行</span>
<span style="font-size: 12pt;">Callable</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">任务和中止任务执行的服务，其定义的方法主要有：</span>
<span style="font-size: 12pt;"></span>
</p>
<ul type="disc" style="margin-top: 0cm;">
<li class="MsoNormal"><span style="font-size: 12pt;">submit(task)</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">：可用来提交</span>
<span style="font-size: 12pt;">Callable</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">或</span>
<span style="font-size: 12pt;">Runnable</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">任务，并返回代表此任务的</span>
<span style="font-size: 12pt;">Future</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">对象</span>
<span style="font-size: 12pt;"></span>
 </li>
<li class="MsoNormal"><span style="font-size: 12pt;">invokeAll(collection of tasks)</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">：批处理任务集合，并返回一个代表这些任务的</span>
<span style="font-size: 12pt;">Future</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">对象集合</span>
<span style="font-size: 12pt;"></span>
 </li>
<li class="MsoNormal"><span style="font-size: 12pt;">shutdown()</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">：在完成已提交的任务后关闭服务，不再接受新任务</span>
<span style="font-size: 12pt;"></span>
 </li>
<li class="MsoNormal"><span style="font-size: 12pt;">shutdownNow()</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">：停止所有正在执行的任务并关闭服务。</span>
<span style="font-size: 12pt;"></span>
 </li>
<li class="MsoNormal"><span style="font-size: 12pt;">isTerminated()</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">：测试是否所有任务都执行完毕了。</span>
<span style="font-size: 12pt;"></span>
 </li>
<li class="MsoNormal"><span style="font-size: 12pt;">isShutdown()</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">：测试是否该</span>
<span style="font-size: 12pt;">ExecutorService</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">已被关闭</span>
<span style="font-size: 12pt;"></span>
 </li>
</ul>
<p class="MsoNormal"><span style="font-size: 12pt;">ScheduledExecutorService</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">接口</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">在</span>
<span style="font-size: 12pt;">ExecutorService</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">的基础上，</span>
<span style="font-size: 12pt;">ScheduledExecutorService</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">提供了按时间安排执行任务的功能，它提供的方法主要有：</span>
<span style="font-size: 12pt;"></span>
</p>
<ul type="disc" style="margin-top: 0cm;">
<li class="MsoNormal"><span style="font-size: 12pt;">schedule(task, initDelay): </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">安排所提交的</span>
<span style="font-size: 12pt;">Callable</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">或</span>
<span style="font-size: 12pt;">Runnable</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">任务在</span>
<span style="font-size: 12pt;">initDelay</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">指定的时间后执行。</span>
<span style="font-size: 12pt;"></span>
 </li>
<li class="MsoNormal"><span style="font-size: 12pt;">scheduleAtFixedRate()</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">：安排所提交的</span>
<span style="font-size: 12pt;">Runnable</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">任务按指定的间隔重复执行</span>
<span style="font-size: 12pt;"></span>
 </li>
<li class="MsoNormal"><span style="font-size: 12pt;">scheduleWithFixedDelay()</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">：安排所提交的</span>
<span style="font-size: 12pt;">Runnable</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">任务在每次执行完后，等待</span>
<span style="font-size: 12pt;">delay</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">所指定的时间后重复执行。</span>
<span style="font-size: 12pt;"></span>
 </li>
</ul>
<p class="MsoNormal"><span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">代码：</span>
<span style="font-size: 12pt;">ScheduleExecutorService</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">的例子</span>
<span style="font-size: 12pt;"></span>
</p>
<table cellspacing="0" border="1" cellpadding="0" style="border-style: none; border-collapse: collapse;">
<tbody>
<tr>
<td valign="top" width="568" style="border: 0.5pt solid windowtext; padding: 0cm 5.4pt; width: 426.1pt;">
<p class="MsoNormal"><span style="font-size: 12pt;">public class ScheduledExecutorServiceTest {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
public static void main(String[] args) </span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
throws InterruptedException, ExecutionException{</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
//*1</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
ScheduledExecutorService service = Executors.newScheduledThreadPool(2);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
//*2</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
Runnable task1 = new Runnable() {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
public void run() {</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
System.out.println(&quot;Task repeating.&quot;);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
};</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
//*3</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
final ScheduledFuture future1 = </span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
service.scheduleAtFixedRate(task1, 0, 1, TimeUnit.SECONDS);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
//*4</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
ScheduledFuture future2 = service.schedule(new Callable(){</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
public String call(){</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
future1.cancel(true);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
return &quot;task cancelled!&quot;;</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}, 5, TimeUnit.SECONDS);</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
System.out.println(future2.get());</span>
</p>
<p class="MsoNormal" style="text-indent: 69pt;"><span style="font-size: 12pt;">//*5</span>
</p>
<p class="MsoNormal" style="text-indent: 69pt;"><span style="font-size: 12pt;">service.shutdown();</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
}</span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">}</span>
</p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp; 这个例子有两个任务，第一个任务每隔一秒打印一句&ldquo;</span>
<span style="font-size: 12pt;">Task repeating</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">&rdquo;</span>
<span style="font-size: 12pt;">,</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">第二个任务在</span>
<span style="font-size: 12pt;">5</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">秒钟后取消第一个任务。</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">*1: </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">初始化一个</span>
<span style="font-size: 12pt;">ScheduledExecutorService</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">对象，这个对象的线程池大小为</span>
<span style="font-size: 12pt;">2</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">。</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">*2: </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">用内函数的方式定义了一个</span>
<span style="font-size: 12pt;">Runnable</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">任务。</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">*3: </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">调用所定义的</span>
<span style="font-size: 12pt;">ScheduledExecutorService</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">对象来执行任务，任务每秒执行一次。能重复执行的任务一定是</span>
<span style="font-size: 12pt;">Runnable</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">类型。注意我们可以用</span>
<span style="font-size: 12pt;">TimeUnit</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">来制定时间单位，这也是</span>
<span style="font-size: 12pt;">Java 5.0</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">里新的特征，</span>
<span style="font-size: 12pt;">5.0</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">以前的记时单位是微秒，现在可精确到奈秒。</span>
<span style="font-size: 12pt;"></span>
</p>
<p class="MsoNormal"><span style="font-size: 12pt;">*4: </span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">调用</span>
<span style="font-size: 12pt;">ScheduledExecutorService</span>
<span lang="ZH-CN" style="font-size: 12pt; font-family: 宋体;">对象来执行第二个任务，第