<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AgilePHP &#187; Java</title>
	<atom:link href="http://www.agilephp.net/category/technology/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.agilephp.net</link>
	<description>开发可以敏捷，人生需要慢慢体味</description>
	<lastBuildDate>Fri, 09 Jul 2010 14:37:06 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>使用JDK进行Performance Tuning</title>
		<link>http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/</link>
		<comments>http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 13:40:41 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[软件]]></category>
		<category><![CDATA[jconsole]]></category>
		<category><![CDATA[jdk]]></category>
		<category><![CDATA[jmap]]></category>
		<category><![CDATA[jps]]></category>
		<category><![CDATA[jvisualvm]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[tuning]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2010/04/%e4%bd%bf%e7%94%a8jdk%e8%bf%9b%e8%a1%8cperformance-tuning/</guid>
		<description><![CDATA[JDK里有三个很好用的工具，jmap，jconsole和jvisualvm，三个工具都各有所侧重，但是如果你的系统遇到性能瓶颈（内存不足或是CPU占用率过高），你可以通过这三个工具来发现应用里的hot spot。我今天只记一下大概的用法，给自己做个备忘，详细的使用说明，等忙完了这段时间，整理一下。
先介绍一个小工具，jps，这也是jdk自带的工具之一，可以列出系统里所有的java进程。
jmap可以查看程序中堆的使用情况，具体的用法是：
jmap –histo:live &#60;pid&#62;；
以及可以将堆dump到一个文件，命令是：
jmap –dump:format=b,file=heap.bin &#60;pid&#62;；
请在&#60;pid&#62;处填入相应的进程的id。
jconsole可以查看某个java进程的内存使用、CPU占用率等，
如果想要远程查看某一java程序，则需要在该程序启动参数里加下如下参数：
-Dcom.sun.management.jmxremote   -Dcom.sun.management.jmxremote.port=9001     -Dcom.sun.management.jmxremote.authenticate=false    -Dcom.sun.management.jmxremote.ssl=false
上文使用的9001是监听的端口号，你可以指定其他的值。然后在你的终端键入jconsole，选择连接远程进程，并填入相应的主机名和端口即可。如果无法连接，请修改/etc/hosts里的内容，将localhost绑定到机器的外部ip地址。
相应的数据可以导出为一个csv文件，这个很方便。
jvisualvm功能与jconsole的基本类似，但是可以做性能分析。
即可以分析出CPU时间被哪些线程所占用了，等等，并且它支持jmx，这东西我只听说过没用过，先放一边不表。
配置jvisualvm不需要改动原程序的启动参数，只需要在远程主机上运行jstatd即可。
新建一个叫jstatd.all.policy的文件，内容是：
grant codebase &#34;file:${java.home}/../lib/tools.jar&#34; {   &#160;&#160;&#160; permission java.security.AllPermission;    };
然后使用如下命令启动jstatd，
jstatd -J-Djava.security.policy=jstatd.all.policy
然后在jvisualvm里选择添加远程主机即可。如果无法连接，请修改/etc/hosts里的内容，将localhost绑定到机器的外部ip地址。










Related Posts

		Java中线程同步的简单用法
		Python and RRD
		QQ五笔输入法
	
<!-- Easy AdSense V2.90 -->
<!-- Post[count: 3] -->
<div class="ezAdsense adsense adsense-leadout" style="float:left;margin:12px;"><script type="text/javascript"><!--
google_ad_client = "pub-1450467177950189";
/* AgilePHP Lite Ad */
google_ad_slot = "7710335250";
google_ad_width = 234;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<!-- Easy AdSense V2.90 -->



<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/java-wait-and-notify/" rel="bookmark">Java中线程同步的简单用法</a><!-- (5.53993)--></li>
		<li><a href="http://www.agilephp.net/2010/01/python-and-rrd/" rel="bookmark">Python and RRD</a><!-- (4.87102)--></li>
		<li><a href="http://www.agilephp.net/2009/12/qq-wubi-input-method/" rel="bookmark">QQ五笔输入法</a><!-- (4.83449)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p>JDK里有三个很好用的工具，<a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.html">jmap</a>，<a href="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html">jconsole</a>和<a href="http://java.sun.com/javase/6/docs/technotes/tools/share/jvisualvm.html">jvisualvm</a>，三个工具都各有所侧重，但是如果你的系统遇到性能瓶颈（内存不足或是CPU占用率过高），你可以通过这三个工具来发现应用里的hot spot。我今天只记一下大概的用法，给自己做个备忘，详细的使用说明，等忙完了这段时间，整理一下。</p>
<p>先介绍一个小工具，jps，这也是jdk自带的工具之一，可以列出系统里所有的java进程。</p>
<p><strong>jmap可以查看程序中堆的使用情况，具体的用法是：</strong></p>
<p>jmap –histo:live &lt;pid&gt;；</p>
<p>以及可以将堆dump到一个文件，命令是：</p>
<p>jmap –dump:format=b,file=heap.bin &lt;pid&gt;；</p>
<p>请在&lt;pid&gt;处填入相应的进程的id。</p>
<p><strong>jconsole可以查看某个java进程的内存使用、CPU占用率等，</strong></p>
<p>如果想要远程查看某一java程序，则需要在该程序启动参数里加下如下参数：</p>
<p>-Dcom.sun.management.jmxremote   <br />-Dcom.sun.management.jmxremote.port=<em>9001     <br /></em>-Dcom.sun.management.jmxremote.authenticate=false    <br />-Dcom.sun.management.jmxremote.ssl=false</p>
<p>上文使用的9001是监听的端口号，你可以指定其他的值。然后在你的终端键入jconsole，选择连接远程进程，并填入相应的主机名和端口即可。<em>如果无法连接，请修改/etc/hosts里的内容，将localhost绑定到机器的外部ip地址。</em></p>
<p>相应的数据可以导出为一个csv文件，这个很方便。</p>
<p><strong>jvisualvm功能与jconsole的基本类似，但是可以做性能分析。</strong></p>
<p>即可以分析出CPU时间被哪些线程所占用了，等等，并且它支持<a href="http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/">jmx</a>，这东西我只听说过没用过，先放一边不表。</p>
<p>配置jvisualvm不需要改动原程序的启动参数，只需要在远程主机上运行<a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstatd.html">jstatd</a>即可。</p>
<p>新建一个叫jstatd.all.policy的文件，内容是：</p>
<p>grant codebase &quot;file:${java.home}/../lib/tools.jar&quot; {   <br />&#160;&#160;&#160; permission java.security.AllPermission;    <br />};</p>
<p>然后使用如下命令启动jstatd，</p>
<p>jstatd -J-Djava.security.policy=jstatd.all.policy</p>
<p>然后在jvisualvm里选择添加远程主机即可。<em>如果无法连接，请修改/etc/hosts里的内容，将localhost绑定到机器的外部ip地址。</em></p>


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/java-wait-and-notify/" rel="bookmark">Java中线程同步的简单用法</a><!-- (5.53993)--></li>
		<li><a href="http://www.agilephp.net/2010/01/python-and-rrd/" rel="bookmark">Python and RRD</a><!-- (4.87102)--></li>
		<li><a href="http://www.agilephp.net/2009/12/qq-wubi-input-method/" rel="bookmark">QQ五笔输入法</a><!-- (4.83449)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>大数据量系统</title>
		<link>http://www.agilephp.net/2010/02/system-scalability-and-performance/</link>
		<comments>http://www.agilephp.net/2010/02/system-scalability-and-performance/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 02:54:58 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[scalability]]></category>
		<category><![CDATA[大数据量]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2010/02/%e5%a4%a7%e6%95%b0%e6%8d%ae%e9%87%8f%e7%a8%8b%e5%ba%8f/</guid>
		<description><![CDATA[这半个月一直在忙，忙着改程序，做实验，原来的系统的处理能力是10^4/10^5，我现在需要处理的数据量是10^6/10^7。原来正常的程序却出现了各种各样的异常，最明显的问题有两个，一个是OutOfMemory，一个是Connection Reset。
前一个问题有很多种不同的解决方法，就是增加机器的物理内存，调优jvm的启动参数，如果这些都解决不了问题，那就是程序本身的问题。我遇到的最多的就是BufferedReader溢出、ArrayList的不正确使用。这些问题都解决了还是会发现莫明其妙的溢出的话，还是增加物理内存吧。jvm虽然有垃圾收集机制，但是如果程序设计的初衷就没有为大数据量的数据考虑过的话，内存消耗真是件杯具而且及其不好解决在问题，特别是在code base有10^5级别的时候。
后一个问题，目前我还没有找到好的解决办法，目前能想到的，就是增加发送和接收缓存，平滑发送的速率，可是16*16的链接还是会莫明其妙的断掉。
郁闷了！还是需要再接再厉，外围的方案解决不了问题的话，只能去动核心的代码了。身边也没有有经验的人可以请教，我自己现在倒是对大数据量、巨数据量系统的可伸缩性和性能有了很强的兴趣。


Related Posts

		使用JDK进行Performance Tuning
	


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/" rel="bookmark">使用JDK进行Performance Tuning</a><!-- (3)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p>这半个月一直在忙，忙着改程序，做实验，原来的系统的处理能力是10^4/10^5，我现在需要处理的数据量是10^6/10^7。原来正常的程序却出现了各种各样的异常，最明显的问题有两个，一个是OutOfMemory，一个是Connection Reset。</p>
<p>前一个问题有很多种不同的解决方法，就是增加机器的物理内存，调优jvm的启动参数，如果这些都解决不了问题，那就是程序本身的问题。我遇到的最多的就是BufferedReader溢出、ArrayList的不正确使用。这些问题都解决了还是会发现莫明其妙的溢出的话，还是增加物理内存吧。jvm虽然有垃圾收集机制，但是如果程序设计的初衷就没有为大数据量的数据考虑过的话，内存消耗真是件杯具而且及其不好解决在问题，特别是在code base有10^5级别的时候。</p>
<p>后一个问题，目前我还没有找到好的解决办法，目前能想到的，就是增加发送和接收缓存，平滑发送的速率，可是16*16的链接还是会莫明其妙的断掉。</p>
<p>郁闷了！还是需要再接再厉，外围的方案解决不了问题的话，只能去动核心的代码了。身边也没有有经验的人可以请教，我自己现在倒是对大数据量、巨数据量系统的可伸缩性和性能有了很强的兴趣。</p>


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/" rel="bookmark">使用JDK进行Performance Tuning</a><!-- (3)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2010/02/system-scalability-and-performance/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Python and RRD</title>
		<link>http://www.agilephp.net/2010/01/python-and-rrd/</link>
		<comments>http://www.agilephp.net/2010/01/python-and-rrd/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 01:33:33 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[python-pyrrd]]></category>
		<category><![CDATA[python-rrd]]></category>
		<category><![CDATA[python-rrdtool]]></category>
		<category><![CDATA[rrd]]></category>
		<category><![CDATA[rrdtool]]></category>
		<category><![CDATA[xenserver]]></category>
		<category><![CDATA[时序数据库]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2010/01/python-and-rrd/</guid>
		<description><![CDATA[RRD是Round Robin Database的意思，RRDTool是用来管理RRD的一个工具。RRDTool的主页在这里，Wikipedia的页面在这里。RRD其实就是一个时序数据库，使用一个固定大小的环型buffer，适用于存储一些统计性的信息，如CPU负载呀，气温变化呀。我为什么要说这个东西呢，因为XenServer里的性能统计是用的RRD，你可以访问诸如http://xenserver-host/rrd_updates?cf=AVERAGE&#38;interval=5&#38;start=123131321形式的网址来获取统计信息。XenServer将返回一个XML文件，这个XML文件其实就是用rrdtool里的export工具导出的。
好，下载完成了这个文件以后，我们假设文件名是data.xml，你可以使用rrdtool restore data.xml data.rrd的方式将数据重新恢复成rrd的格式，然后就可以使用rrdtool进行一系列操作。rrdtool的操作可以写十篇博客，这不是我今天想说的重点。
我今天想说的是，当我把rrdtool跟Python集成的时候，发现Python提供了若干封装的工具，比如Python-PyRRD，Python-rrd，Python-rrdtool，我想没几个人能搞明白这几者之间的关系吧。我来说一下。
Python-rrdtool，这个就是rrdtool的一个Python封装，调用方式与rrdtool里命令的格式是一致的。
Python-rrd，这个据说应该是rrdtool的前身，命名方式不符合Python的命名策略，所以改名成了Python-rrdtool，但是debian和ubuntu的源里还保留了一个过渡性质的傀儡包（transitional dummy package），其实就是Python-rrdtool
Python-PyRRD，这个是OO化的rrdtool封装，个人比较推荐用这个包，方便，代码也更容易让人理解。
另外，Java也提供了两个rrdtool的封装，一个是JRobin，一个是rrd4j，后者是在前者的基础上做的，提供了更好的OO的支持和性能。但是这两个项目似乎更新得很慢，XenServer导出的rrd数据（version 0003）他们现在不支持（只支持到version 0001）。所以想用Java分析XenServer的性能，还是自己去解析那个xml文件吧。


Related Posts

		在Google App Engine上进行开发
		了解一些“云”
		AOP in PHP
	


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/dev-in-google-app-engine/" rel="bookmark">在Google App Engine上进行开发</a><!-- (7.48529)--></li>
		<li><a href="http://www.agilephp.net/2009/08/cloud-to-overview/" rel="bookmark">了解一些“云”</a><!-- (4.71185)--></li>
		<li><a href="http://www.agilephp.net/2009/09/aop-in-php/" rel="bookmark">AOP in PHP</a><!-- (3.58277)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p>RRD是Round Robin Database的意思，<a href="http://oss.oetiker.ch/rrdtool/ " target="_blank">RRDTool</a>是用来管理RRD的一个工具。<a href="http://oss.oetiker.ch/rrdtool/ " target="_blank">RRDTool</a>的<a href="http://oss.oetiker.ch/rrdtool/ " target="_blank">主页</a>在这里，Wikipedia的页面在<a href="http://en.wikipedia.org/wiki/RRDtool" target="_blank">这里</a>。RRD其实就是一个时序数据库，使用一个固定大小的<a href="http://en.wikipedia.org/wiki/Circular_buffer" target="_blank">环型buffer</a>，适用于存储一些统计性的信息，如CPU负载呀，气温变化呀。我为什么要说这个东西呢，因为XenServer里的性能统计是用的RRD，你可以访问诸如<a href="http://xenserver-host/rrd_updates?cf=AVERAGE&amp;interval=5&amp;start=123131321">http://xenserver-host/rrd_updates?cf=AVERAGE&amp;interval=5&amp;start=123131321</a>形式的网址来获取统计信息。XenServer将返回一个XML文件，这个XML文件其实就是用rrdtool里的export工具导出的。</p>
<p>好，下载完成了这个文件以后，我们假设文件名是data.xml，你可以使用rrdtool restore data.xml data.rrd的方式将数据重新恢复成rrd的格式，然后就可以使用rrdtool进行一系列操作。rrdtool的操作可以写十篇博客，这不是我今天想说的重点。</p>
<p>我今天想说的是，当我把rrdtool跟Python集成的时候，发现Python提供了若干封装的工具，比如Python-PyRRD，Python-rrd，Python-rrdtool，我想没几个人能搞明白这几者之间的关系吧。我来说一下。</p>
<p>Python-rrdtool，这个就是rrdtool的一个Python封装，调用方式与rrdtool里命令的格式是一致的。</p>
<p>Python-rrd，这个据说应该是rrdtool的前身，命名方式不符合Python的命名策略，所以改名成了Python-rrdtool，但是debian和ubuntu的源里还保留了一个过渡性质的傀儡包（transitional dummy package），其实就是Python-rrdtool</p>
<p>Python-PyRRD，这个是OO化的rrdtool封装，个人比较推荐用这个包，方便，代码也更容易让人理解。</p>
<p>另外，Java也提供了两个rrdtool的封装，一个是<a href="http://www.jrobin.org/" target="_blank">JRobin</a>，一个是<a href="https://rrd4j.dev.java.net/" target="_blank">rrd4j</a>，后者是在前者的基础上做的，提供了更好的OO的支持和性能。但是这两个项目似乎更新得很慢，XenServer导出的rrd数据（version 0003）他们现在不支持（只支持到version 0001）。所以想用Java分析XenServer的性能，还是自己去解析那个xml文件吧。</p>


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/dev-in-google-app-engine/" rel="bookmark">在Google App Engine上进行开发</a><!-- (7.48529)--></li>
		<li><a href="http://www.agilephp.net/2009/08/cloud-to-overview/" rel="bookmark">了解一些“云”</a><!-- (4.71185)--></li>
		<li><a href="http://www.agilephp.net/2009/09/aop-in-php/" rel="bookmark">AOP in PHP</a><!-- (3.58277)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2010/01/python-and-rrd/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Java中线程同步的简单用法</title>
		<link>http://www.agilephp.net/2009/10/java-wait-and-notify/</link>
		<comments>http://www.agilephp.net/2009/10/java-wait-and-notify/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 02:14:36 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[concurrence]]></category>
		<category><![CDATA[IllegalMonitorStateException]]></category>
		<category><![CDATA[notify]]></category>
		<category><![CDATA[notifyAll]]></category>
		<category><![CDATA[synchronized]]></category>
		<category><![CDATA[thread]]></category>
		<category><![CDATA[wait]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2009/10/java%e4%b8%ad%e7%ba%bf%e7%a8%8b%e5%90%8c%e6%ad%a5%e7%9a%84%e7%ae%80%e5%8d%95%e7%94%a8%e6%b3%95/</guid>
		<description><![CDATA[应用场景：应用程序需要新建若干线程进行事务处理，这些线程处理完毕后，应用程序会进行一些后续的操作。
解决办法：使用Object.wait()，Object.notify()方法。Object.wait()方法会阻断当前线程的执行，直到其他线程调用Object.notify()。
于是可以很快的写出一个示例程序：
public static void main(String[] args) {
    final Object syncObj = new Object();

    Thread thread = new Thread() {
        public void run() {
            try {
        [...]

<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/12/linux-unix-benchmark/" rel="bookmark">Linux\Unix性能测试</a><!-- (20.0084)--></li>
		<li><a href="http://www.agilephp.net/2009/11/couchdb-on-centos-5-4/" rel="bookmark">在CentOS 5.4上安装CouchDB</a><!-- (12.9055)--></li>
		<li><a href="http://www.agilephp.net/2010/01/fix-chrome-to-add-extensions-in-a-junction-folder/" rel="bookmark">使用mklink或junction后Chrome无法安装扩展的解决办法</a><!-- (12.6265)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p>应用场景：应用程序需要新建若干线程进行事务处理，这些线程处理完毕后，应用程序会进行一些后续的操作。</p>
<p>解决办法：使用Object.wait()，Object.notify()方法。<a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#wait%28%29" target="_blank">Object.wait()</a>方法会阻断当前线程的执行，直到其他线程调用<a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#notify%28%29" target="_blank">Object.notify()</a>。</p>
<p>于是可以很快的写出一个示例程序：</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> main(String[] args) {
    final Object syncObj = <span class="kwrd">new</span> Object();

    Thread thread = <span class="kwrd">new</span> Thread() {
        <span class="kwrd">public</span> <span class="kwrd">void</span> run() {
            <span class="kwrd">try</span> {
                Thread.sleep(3000);

                synchronized(syncObj) {
                    syncObj.notify();
                }
            } <span class="kwrd">catch</span> (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };

    thread.start();

    synchronized(syncObj) {
        <span class="kwrd">try</span> {
            syncObj.wait();
        } <span class="kwrd">catch</span> (InterruptedException e) {
            e.printStackTrace();
        }
    }

    System.<span class="kwrd">out</span>.println(<span class="str">&quot;Exit&quot;</span>);
}</pre>
<p>&#160;</p>
<p>调用wait和notify方法前，一定要用synchronized(syncObj)，否则会抛出IllegalMonitorStateException。</p>
<p>有空再写写Concurrence Util里的工具类，简化上面的操作。<br />
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style></p>


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/12/linux-unix-benchmark/" rel="bookmark">Linux\Unix性能测试</a><!-- (20.0084)--></li>
		<li><a href="http://www.agilephp.net/2009/11/couchdb-on-centos-5-4/" rel="bookmark">在CentOS 5.4上安装CouchDB</a><!-- (12.9055)--></li>
		<li><a href="http://www.agilephp.net/2010/01/fix-chrome-to-add-extensions-in-a-junction-folder/" rel="bookmark">使用mklink或junction后Chrome无法安装扩展的解决办法</a><!-- (12.6265)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2009/10/java-wait-and-notify/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
