﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-听风流过-文章分类-JAVA</title><link>http://www.blogjava.net/tingfeng/category/30462.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 09 Feb 2021 23:32:49 GMT</lastBuildDate><pubDate>Tue, 09 Feb 2021 23:32:49 GMT</pubDate><ttl>60</ttl><item><title>Java_观察者模式（Observable和Observer）</title><link>http://www.blogjava.net/tingfeng/articles/432686.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Tue, 25 Jul 2017 02:39:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/432686.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/432686.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/432686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/432686.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/432686.html</trackback:ping><description><![CDATA[
		<h2>一、观察者模式介绍<br /></h2>
		<blockquote>
				<p>
						<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">在Java中通过Observable类和Observer接口实现了观察者模式。一个Observer对象监视着一个Observable对象的变化，当Observable对象发生变化时，Observer得到通知，就可以进行相应的工作。</span>
				</p>
		</blockquote>
		<blockquote>
				<p>
						<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">如果画面A是显示数据库里面的数据，而画面B修改了数据库里面的数据，那么这时候画面A就要重新Load。这时候就可以用到观察者模式</span>
				</p>
		</blockquote>
		<h2>
				<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">
				</span>
		</h2>
		<h2>二、观察者模式实现方法<br /></h2>
		<p>
				<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">java.util.Observable中有两个方法对Observer特别重要</span>
		</p>
		<p>
				<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">①setChanged()方法<br /></span>
		</p>
		<p>
				<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">
				</span>
		</p>
		<div class="dp-highlighter bg_java">
				<div class="bar">
						<div class="tools">
								<span class="tracking-ad" data-mod="popu_168">
										<div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all">
												<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
												<span style="color: #008080; ">1</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">/**</span><span style="color: #008000; "> <br /></span><span style="color: #008080; ">2</span> <span style="color: #008000; ">     * Sets the changed flag for this {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> Observable}. After calling <br /></span><span style="color: #008080; ">3</span> <span style="color: #008000; ">     * {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> setChanged()}, {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> hasChanged()} will return {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> true}. <br /></span><span style="color: #008080; ">4</span> <span style="color: #008000; ">     </span><span style="color: #008000; ">*/</span><span style="color: #000000; ">  <br /></span><span style="color: #008080; ">5</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">protected</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> setChanged() {  <br /></span><span style="color: #008080; ">6</span> <span style="color: #000000; ">        changed </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;  <br /></span><span style="color: #008080; ">7</span> <span style="color: #000000; ">    }  </span></div>
										<br />
								</span>
								<span class="tracking-ad" data-mod="popu_169">
								</span>
						</div>
				</div>
		</div>②notifyObservers()方法 / notifyObservers(Object data)方法

<p><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"></span></span></p><div class="dp-highlighter bg_java"><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; "> 1</span> <span style="color: #008000; ">/**</span><span style="color: #008000; "> <br /></span><span style="color: #008080; "> 2</span> <span style="color: #008000; "> * If {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> hasChanged()} returns {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> true}, calls the {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> update()} <br /></span><span style="color: #008080; "> 3</span> <span style="color: #008000; "> * method for every observer in the list of observers using null as the <br /></span><span style="color: #008080; "> 4</span> <span style="color: #008000; "> * argument. Afterwards, calls {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> clearChanged()}. <br /></span><span style="color: #008080; "> 5</span> <span style="color: #008000; "> * &lt;p&gt; <br /></span><span style="color: #008080; "> 6</span> <span style="color: #008000; "> * Equivalent to calling {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> notifyObservers(null)}. <br /></span><span style="color: #008080; "> 7</span> <span style="color: #008000; "> </span><span style="color: #008000; ">*/</span><span style="color: #000000; ">  <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> notifyObservers() {  <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">    notifyObservers(</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">}  <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">  <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; "></span><span style="color: #008000; ">/**</span><span style="color: #008000; "> <br /></span><span style="color: #008080; ">13</span> <span style="color: #008000; "> * If {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> hasChanged()} returns {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> true}, calls the {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> update()} <br /></span><span style="color: #008080; ">14</span> <span style="color: #008000; "> * method for every Observer in the list of observers using the specified <br /></span><span style="color: #008080; ">15</span> <span style="color: #008000; "> * argument. Afterwards calls {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> clearChanged()}. <br /></span><span style="color: #008080; ">16</span> <span style="color: #008000; "> * <br /></span><span style="color: #008080; ">17</span> <span style="color: #008000; "> * </span><span style="color: #808080; ">@param</span><span style="color: #008000; "> data <br /></span><span style="color: #008080; ">18</span> <span style="color: #008000; "> *            the argument passed to {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> update()}. <br /></span><span style="color: #008080; ">19</span> <span style="color: #008000; "> </span><span style="color: #008000; ">*/</span><span style="color: #000000; ">  <br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; ">@SuppressWarnings(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">unchecked</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)  <br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> notifyObservers(Object data) {  <br /></span><span style="color: #008080; ">22</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> size </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;  <br /></span><span style="color: #008080; ">23</span> <span style="color: #000000; ">    Observer[] arrays </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;  <br /></span><span style="color: #008080; ">24</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">synchronized</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; ">25</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (hasChanged()) {  <br /></span><span style="color: #008080; ">26</span> <span style="color: #000000; ">            clearChanged();  <br /></span><span style="color: #008080; ">27</span> <span style="color: #000000; ">            size </span><span style="color: #000000; ">=</span><span style="color: #000000; "> observers.size();  <br /></span><span style="color: #008080; ">28</span> <span style="color: #000000; ">            arrays </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Observer[size];  <br /></span><span style="color: #008080; ">29</span> <span style="color: #000000; ">            observers.toArray(arrays);  <br /></span><span style="color: #008080; ">30</span> <span style="color: #000000; ">        }  <br /></span><span style="color: #008080; ">31</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">32</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (arrays </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; ">33</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (Observer observer : arrays) {  <br /></span><span style="color: #008080; ">34</span> <span style="color: #000000; ">            observer.update(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">, data);  <br /></span><span style="color: #008080; ">35</span> <span style="color: #000000; ">        }  <br /></span><span style="color: #008080; ">36</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">37</span> <span style="color: #000000; ">} </span></div><br /></div><br />
以上两个方法十分重要

<p><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">setChanged()<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">方法
 —— <br /></span></span></span></p><blockquote><p><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">用来设置一个内部标志位注明数据发生了变化</span></span></span></p></blockquote><p><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"></span><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">notifyObservers()方法
 / notifyObservers(Object data)方法 —— <br /></span></span></p><blockquote><p><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px">通知所有的<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">Observer</span></span>数据发生了变化，这时所有的<span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">Observer</span></span></span></span>会自动调用复写好的<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">update(Observable
 observable, Object data)</span></span>方法来做一些处理（比如说画面数据的更新）。</span></span></p><p><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px">我们可以看到通知<span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">Observer</span></span></span></span>有两个方法，一个无参，一个有参。那么这个参数有什么作用呢？</span></span></p><p><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px">其中一个作用：现在我不想通知所有的<span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">Observer</span></span></span></span></span></span>，而只想其中一个指定的<span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px">Observer做一些处理，那么就可以传一个参数作为ID，然后在所有的<span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">Observer</span></span></span></span></span></span></span></span>中判断，每个<span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">Observer</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>判断只有接收到底参数ID是属于自己的才做一些处理。</span></span></span></span></span></span></span></span></span><br /></span></p><p><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">当然参数还有其他作用，我只是举了个例子。</span></p></blockquote><p><br /></p><p>下面举个例子加以说明：<br /></p><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; "> 1</span> <span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.Observable;    <br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; "></span><span style="color: #008000; ">/**</span><span style="color: #008000; "> <br /></span><span style="color: #008080; "> 3</span> <span style="color: #008000; "> * 被观察者类 <br /></span><span style="color: #008080; "> 4</span> <span style="color: #008000; "> </span><span style="color: #008000; ">*/</span><span style="color: #000000; ">      <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> SimpleObservable </span><span style="color: #0000FF; ">extends</span><span style="color: #000000; "> Observable    <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">{    <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">   </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> data </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;    <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">   </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> getData(){     <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> data;    <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">   }    <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">   </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> setData(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i){    <br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.data </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> i) {   <br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">          </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.data </span><span style="color: #000000; ">=</span><span style="color: #000000; "> i;   <br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">          setChanged();    <br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; ">  <br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; ">          </span><span style="color: #008000; ">//</span><span style="color: #008000; ">只有在setChange()被调用后，notifyObservers()才会去调用update()，否则什么都不干。  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">19</span> <span style="color: #008000; "></span><span style="color: #000000; ">          notifyObservers();      <br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; ">       }    <br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">   }    <br /></span><span style="color: #008080; ">22</span> <span style="color: #000000; ">} </span></div><br />上面这个类是一个被观察者类，它继承了Observable类，表示这个类是可以被观察的。

<p>然后在setData()方法里面，也就是数据改变的地方，来调用Observable类的setChanged()方法和notifyObservers()方法，表示数据已改变并通知所有的Observer调用它们的update()方法做一些处理。</p><p>注意：<span><span class="comment">只有在setChange()被调用后，notifyObservers()才会去调用update()，否则什么都不干。</span></span></p><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; "> 1</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">/**</span><span style="color: #008000; "> <br /></span><span style="color: #008080; "> 2</span> <span style="color: #008000; ">     * 观察者类 <br /></span><span style="color: #008080; "> 3</span> <span style="color: #008000; ">     </span><span style="color: #008000; ">*/</span><span style="color: #000000; ">        <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> SimpleObserver </span><span style="color: #0000FF; ">implements</span><span style="color: #000000; "> Observer    <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">    {    <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> SimpleObserver(SimpleObservable simpleObservable){    <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">          simpleObservable.addObserver(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; "> );    <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">       }    <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">          <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> update(Observable observable ,Object data){  </span><span style="color: #008000; ">//</span><span style="color: #008000; "> data为任意对象，用于传递参数  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">11</span> <span style="color: #008000; "></span><span style="color: #000000; ">          System.out.println(“Data has changed to” </span><span style="color: #000000; ">+</span><span style="color: #000000; "> (SimpleObservable)observable.getData());    <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">       }    <br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">    }   </span></div><br />通过生成被观察者（<span><span>SimpleObservable类</span></span>）的实例，来调用addObserver(this)方法让观察者（<span><span>SimpleObserver类</span></span>）达到观察被观察者（<span><span>SimpleObservable类</span></span>）的目的。
<p>然后还要复写update()方法，做数据改变后的一些处理。</p><p>下面可以写一个简单的测试类来测试一下</p><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; "> 1</span> <span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> SimpleTest    <br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; ">{    <br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">   </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args){    <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">      SimpleObservable doc </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> SimpleObservable ();    <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">      SimpleObserver view </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> SimpleObserver (doc);    <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">      doc.setData(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);    <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">      doc.setData(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);    <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">      doc.setData(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);    <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">      doc.setData(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">);     <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">   }    <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">}  </span></div><br />
运行结果如下<br /><div class="dp-highlighter bg_plain"><div class="bar"><div class="tools"><b>[plain]</b><a href="http://blog.csdn.net/tianjf0514/article/details/7475164/#" class="ViewSource" title="view plain">view plain</a><span class="tracking-ad" data-mod="popu_168"><a href="http://blog.csdn.net/tianjf0514/article/details/7475164/#" class="CopyToClipboard" title="copy" target="_blank">copy</a></span><span class="tracking-ad" data-mod="popu_169"></span></div></div><ol start="1"><li class="alt"><span><span>Data has changed to 1   </span></span></li><li class=""><span>Data has changed to 2  //第二次setData(2)时由于没有setChange，所以update没被调用  </span></li><li class="alt"><span>Data has changed to 3  </span></li></ol></div><br />
下面介绍一个Observable类的其他一些属性和方法

<p>属性 ——<br /></p><br /><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">1</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> observers是一个List，保存着所有要通知的observer。      </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">2</span> <span style="color: #008000; "></span><span style="color: #000000; ">    List</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Observer</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "> observers </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> ArrayList</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Observer</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();  <br /></span><span style="color: #008080; ">3</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> changed是一个boolean型标志位，标志着数据是否改变了。  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">4</span> <span style="color: #008000; "></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; "> changed </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;  </span></div><br /><p>方法 ——<span style="color:#ff0000"><span style="font-family:Arial"><br /></span></span></p><br /><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; "> 1</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 添加一个Observer到列表observers中  </span><span style="color: #008000; "><br /></span><span style="color: #008080; "> 2</span> <span style="color: #008000; "></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> addObserver(Observer observer) {  <br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (observer </span><span style="color: #000000; ">==</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">throw</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> NullPointerException();  <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">        }  <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">synchronized</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (</span><span style="color: #000000; ">!</span><span style="color: #000000; ">observers.contains(observer))  <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">                observers.add(observer);  <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">        }  <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 从列表observers中删除一个observer  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">13</span> <span style="color: #008000; "></span><span style="color: #000000; ">      <br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">synchronized</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> deleteObserver(Observer observer) {  <br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">        observers.remove(observer);  <br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 清空列表observers  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">19</span> <span style="color: #008000; "></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">synchronized</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> deleteObservers() {  <br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; ">        observers.clear();  <br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">22</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">23</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 返回列表observers中observer的个数  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">24</span> <span style="color: #008000; "></span><span style="color: #000000; ">      <br /></span><span style="color: #008080; ">25</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> countObservers() {  <br /></span><span style="color: #008080; ">26</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> observers.size();  <br /></span><span style="color: #008080; ">27</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">28</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">29</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">30</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 重置数据改变标志位为未改变  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">31</span> <span style="color: #008000; "></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">protected</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> clearChanged() {   <br /></span><span style="color: #008080; ">32</span> <span style="color: #000000; ">    changed </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;  <br /></span><span style="color: #008080; ">33</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">34</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">35</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 将数据改变标志位设置为改变  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">36</span> <span style="color: #008000; "></span><span style="color: #000000; ">      <br /></span><span style="color: #008080; ">37</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">protected</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> setChanged() {   <br /></span><span style="color: #008080; ">38</span> <span style="color: #000000; ">        changed </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;  <br /></span><span style="color: #008080; ">39</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">40</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">41</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">42</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 判断标志位的值  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">43</span> <span style="color: #008000; "></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; "> hasChanged() {   <br /></span><span style="color: #008080; ">44</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> changed;  <br /></span><span style="color: #008080; ">45</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">46</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">47</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 通知所有observer（无参）  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">48</span> <span style="color: #008000; "></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> notifyObservers() {  <br /></span><span style="color: #008080; ">49</span> <span style="color: #000000; ">        notifyObservers(</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">50</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">51</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 通知所有observer（有参）  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">52</span> <span style="color: #008000; "></span><span style="color: #000000; ">    @SuppressWarnings(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">unchecked</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)  <br /></span><span style="color: #008080; ">53</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> notifyObservers(Object data) {   <br /></span><span style="color: #008080; ">54</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> size </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;   <br /></span><span style="color: #008080; ">55</span> <span style="color: #000000; ">        Observer[] arrays </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;   <br /></span><span style="color: #008080; ">56</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">synchronized</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">) {   <br /></span><span style="color: #008080; ">57</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (hasChanged()) {   <br /></span><span style="color: #008080; ">58</span> <span style="color: #000000; ">                clearChanged();   <br /></span><span style="color: #008080; ">59</span> <span style="color: #000000; ">                size </span><span style="color: #000000; ">=</span><span style="color: #000000; "> observers.size();  <br /></span><span style="color: #008080; ">60</span> <span style="color: #000000; ">                arrays </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Observer[size];   <br /></span><span style="color: #008080; ">61</span> <span style="color: #000000; ">                observers.toArray(arrays);   <br /></span><span style="color: #008080; ">62</span> <span style="color: #000000; ">            }   <br /></span><span style="color: #008080; ">63</span> <span style="color: #000000; ">        }   <br /></span><span style="color: #008080; ">64</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (arrays </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {   <br /></span><span style="color: #008080; ">65</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (Observer observer : arrays) {   <br /></span><span style="color: #008080; ">66</span> <span style="color: #000000; ">                observer.update(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">, data);   <br /></span><span style="color: #008080; ">67</span> <span style="color: #000000; ">            }   <br /></span><span style="color: #008080; ">68</span> <span style="color: #000000; ">        }  <br /></span><span style="color: #008080; ">69</span> <span style="color: #000000; ">    }  </span></div><br /><span style="color:#ff0000"><span style="font-family:Arial"></span></span><p><span style="font-family:Arial; font-size:14px; line-height:21px"><span style="color:#ff0000">注意：在Observer对象销毁前一定要用deleteObserver将其从列表中删除，也就是在onDestroy()方法中调用<span style="font-family:Arial; font-size:14px; line-height:21px"><span style="color:#ff0000">deleteObserver</span></span>()方法。</span></span></p><p><span style="font-family:Arial; font-size:14px; line-height:21px"><span style="color:#ff0000">不然因为还存在对象引用的关系，Observer对象不会被垃圾收集，造成内存泄漏，并且已死的Observer仍会被通知到，有可能造成意料外的错误，而且随着列表越来越大，notifyObservers操作也会越来越慢。</span></span></p><p><br /></p><p><span style="font-family:Arial; font-size:14px; line-height:21px"><span style="font-family:Arial; font-size:14px; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; font-size:14px; line-height:25px">下面2个工程是Observable与Observer的经典运用,是android实现的单指拖动放大图片的操作</span></span></span></span></span></p><p><span style="font-family:Arial; color:#333333"><span style="font-size:14px; line-height:21px">两个例子：</span></span></p><p><span style="font-family:Arial; color:#333333"><span style="font-size:14px; line-height:21px"><a href="http://download.csdn.net/detail/tianjf0514/4237628">http://download.csdn.net/detail/tianjf0514/4237628</a><br /></span></span></p><p><span style="font-size:12px"><a href="http://download.csdn.net/download/tianjf0514/4237634">http://download.csdn.net/download/tianjf0514/4237634</a></span></p><p><span style="font-family:Arial; color:#333333"><span style="font-size:14px; line-height:21px"></span></span></p><span style="font-family:Arial; color:#333333"><span style="font-size:14px; line-height:21px"></span></span><img src ="http://www.blogjava.net/tingfeng/aggbug/432686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2017-07-25 10:39 <a href="http://www.blogjava.net/tingfeng/articles/432686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> java线程池的种类和应用 </title><link>http://www.blogjava.net/tingfeng/articles/432685.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Tue, 25 Jul 2017 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/432685.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/432685.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/432685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/432685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/432685.html</trackback:ping><description><![CDATA[
		<p style="">
				<span style="color:#df3434; font-weight:bold;" class="replace_word">转发自 </span>
				<a href="http://lib.csdn.net/base/java" class="replace_word" title="Java 知识库" target="_blank" style="color:#df3434; font-weight:bold;">http://blog.csdn.net/paul342/article/details/52442932<br /></a>
		</p>
		<p style="">
				<a href="http://lib.csdn.net/base/java" class="replace_word" title="Java 知识库" target="_blank" style="color:#df3434; font-weight:bold;">
						<br />
				</a>
		</p>
		<p style="">
				<a href="http://lib.csdn.net/base/java" class="replace_word" title="Java 知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java</a>通过Executors提供四种线程池，分别为：<br />
newCachedThreadPool创建一个可缓存线程池，如果线程池长度超过处理需要，可灵活回收空闲线程，若无可回收，则新建线程。<br />
newFixedThreadPool 创建一个定长线程池，可控制线程最大并发数，超出的线程会在队列中等待。<br />
newScheduledThreadPool 创建一个定长线程池，支持定时及周期性任务执行。<br />
newSingleThreadExecutor 创建一个单线程化的线程池，它只会用唯一的工作线程来执行任务，保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。</p>
		<p style=""> </p>
		<p style="">
				<span style="font-size:18px">
						<strong style="font-weight:bold">(1) newCachedThreadPool</strong>
				</span>
				<br />
创建一个可缓存线程池，如果线程池长度超过处理需要，可灵活回收空闲线程，若无可回收，则新建线程。示例代码如下：</p>
		<div class="dp-highlighter bg_java">
				<div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all">
						<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
						<span style="color: #008080; "> 1</span> <span style="color: #0000FF; ">package</span><span style="color: #000000; "> test;  <br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.ExecutorService;  <br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.Executors;  <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> ThreadPoolExecutorTest {  <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; "> </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) {  <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">  ExecutorService cachedThreadPool </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Executors.newCachedThreadPool();  <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">  </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; "> </span><span style="color: #000000; ">10</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">   </span><span style="color: #0000FF; ">final</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> index </span><span style="color: #000000; ">=</span><span style="color: #000000; "> i;  <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">   </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {  <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">    Thread.sleep(index </span><span style="color: #000000; ">*</span><span style="color: #000000; "> </span><span style="color: #000000; ">1000</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">   } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (InterruptedException e) {  <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">    e.printStackTrace();  <br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">   }  <br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">   cachedThreadPool.execute(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Runnable() {  <br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> run() {  <br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">     System.out.println(index);  <br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; ">   });  <br /></span><span style="color: #008080; ">19</span> <span style="color: #000000; ">  }  <br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; "> }  <br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">} </span></div>
				<br />
		</div>
		<br />
		<span style="">线程池为无限大，当执行第二个任务时第一个任务已经完成，会复用执行第一个任务的线程，而不用每次新建线程。</span>
		<br style="" />
		<span style=""> </span>
		<br style="" />
		<span style="">(2) newFixedThreadPool</span>
		<br style="" />
		<span style="">创建一个定长线程池，可控制线程最大并发数，超出的线程会在队列中等待。示例代码如下：</span>
		<br />
		<div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: #008080; "> 1</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">package</span><span style="color: #000000; "> test;  <br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.ExecutorService;  <br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.Executors;  <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> ThreadPoolExecutorTest {  <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) {  <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">      ExecutorService fixedThreadPool </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Executors.newFixedThreadPool(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">      </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; "> </span><span style="color: #000000; ">10</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">final</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> index </span><span style="color: #000000; ">=</span><span style="color: #000000; "> i;  <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">       fixedThreadPool.execute(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Runnable() {  <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> run() {  <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">         </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {  <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">          System.out.println(index);  <br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">          Thread.sleep(</span><span style="color: #000000; ">2000</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">         } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (InterruptedException e) {  <br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">          e.printStackTrace();  <br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">         }  <br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; ">        }  <br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; ">       });  <br /></span><span style="color: #008080; ">19</span> <span style="color: #000000; ">      }  <br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; ">     }  <br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">    }  </span></div>
		<br />
		<p style="">因为线程池大小为3，每个任务输出index后sleep 2秒，所以每两秒打印3个数字。<br />
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()</p>
		<p style=""> </p>
		<p style="">
				<span style="font-size:18px">(3)  newScheduledThreadPool</span>
				<br />
创建一个定长线程池，支持定时及周期性任务执行。延迟执行示例代码如下：</p>
		<div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: #008080; "> 1</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">package</span><span style="color: #000000; "> test;  <br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.Executors;  <br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.ScheduledExecutorService;  <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.TimeUnit;  <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> ThreadPoolExecutorTest {  <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) {  <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">      ScheduledExecutorService scheduledThreadPool </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Executors.newScheduledThreadPool(</span><span style="color: #000000; ">5</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">      scheduledThreadPool.schedule(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Runnable() {  <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> run() {  <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">        System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">delay 3 seconds</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">       }  <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">      }, </span><span style="color: #000000; ">3</span><span style="color: #000000; ">, TimeUnit.SECONDS);  <br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">     }  <br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">    }  </span></div>
		<br />
		<p style="">表示延迟3秒执行。</p>
		<p style="">定期执行示例代码如下：</p>
		<div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: #008080; "> 1</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">package</span><span style="color: #000000; "> test;  <br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.Executors;  <br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.ScheduledExecutorService;  <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.TimeUnit;  <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> ThreadPoolExecutorTest {  <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) {  <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">      ScheduledExecutorService scheduledThreadPool </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Executors.newScheduledThreadPool(</span><span style="color: #000000; ">5</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">      scheduledThreadPool.scheduleAtFixedRate(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Runnable() {  <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> run() {  <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">        System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">delay 1 seconds, and excute every 3 seconds</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">       }  <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">      }, </span><span style="color: #000000; ">1</span><span style="color: #000000; ">, </span><span style="color: #000000; ">3</span><span style="color: #000000; ">, TimeUnit.SECONDS);  <br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">     }  <br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">    }  </span></div>
		<br />
		<p style="">表示延迟1秒后每3秒执行一次。</p>
		<p style=""> </p>
		<p style="">
				<span style="font-size:18px">(4) newSingleThreadExecutor</span>
				<br />
创建一个单线程化的线程池，它只会用唯一的工作线程来执行任务，保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下：</p>
		<div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: #008080; "> 1</span> <span style="color: #0000FF; ">package</span><span style="color: #000000; "> test;  <br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.ExecutorService;  <br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.Executors;  <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> ThreadPoolExecutorTest {  <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; "> </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) {  <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">  ExecutorService singleThreadExecutor </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Executors.newSingleThreadExecutor();  <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">  </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; "> </span><span style="color: #000000; ">10</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">   </span><span style="color: #0000FF; ">final</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> index </span><span style="color: #000000; ">=</span><span style="color: #000000; "> i;  <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">   singleThreadExecutor.execute(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Runnable() {  <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> run() {  <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">     </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {  <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">      System.out.println(index);  <br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">      Thread.sleep(</span><span style="color: #000000; ">2000</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">     } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (InterruptedException e) {  <br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">      e.printStackTrace();  <br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">     }  <br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; ">   });  <br /></span><span style="color: #008080; ">19</span> <span style="color: #000000; ">  }  <br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; "> }  <br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">} </span></div>
		<br />
		<p style="">结果依次输出，相当于顺序执行各个任务。</p>
		<p style="">你可以使用JDK自带的监控工具来监控我们创建的线程数量，运行一个不终止的线程，创建指定量的线程，来观察：<br />
工具目录：<strong style="font-weight:bold">C:\Program Files\Java\jdk1.6.0_06\bin\jconsole.exe</strong><br />
运行程序做稍微修改：</p>
		<div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: #008080; "> 1</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">package</span><span style="color: #000000; "> test;  <br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.ExecutorService;  <br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.Executors;  <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> ThreadPoolExecutorTest {  <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) {  <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">      ExecutorService singleThreadExecutor </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Executors.newCachedThreadPool();  <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">      </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; "> </span><span style="color: #000000; ">100</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">final</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> index </span><span style="color: #000000; ">=</span><span style="color: #000000; "> i;  <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">       singleThreadExecutor.execute(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Runnable() {  <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> run() {  <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">         </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {  <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">          </span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">           System.out.println(index);  <br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">           Thread.sleep(</span><span style="color: #000000; ">10</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #000000; "> </span><span style="color: #000000; ">1000</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">          }  <br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">         } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (InterruptedException e) {  <br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; ">          e.printStackTrace();  <br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; ">         }  <br /></span><span style="color: #008080; ">19</span> <span style="color: #000000; ">        }  <br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; ">       });  <br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {  <br /></span><span style="color: #008080; ">22</span> <span style="color: #000000; ">        Thread.sleep(</span><span style="color: #000000; ">500</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">23</span> <span style="color: #000000; ">       } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (InterruptedException e) {  <br /></span><span style="color: #008080; ">24</span> <span style="color: #000000; ">        e.printStackTrace();  <br /></span><span style="color: #008080; ">25</span> <span style="color: #000000; ">       }  <br /></span><span style="color: #008080; ">26</span> <span style="color: #000000; ">      }  <br /></span><span style="color: #008080; ">27</span> <span style="color: #000000; ">     }  <br /></span><span style="color: #008080; ">28</span> <span style="color: #000000; ">    }  </span></div>
		<br />
		<p style="">效果如下：</p>
		<p style=""> <img src="http://dl.iteye.com/upload/picture/pic/129496/a37b1415-36ac-30b8-baf6-10897bbf443a.jpg" alt="" style="border:0px" height="348" width="346" /></p>
		<p style="">选择我们运行的程序：</p>
		<p style="">
				<img src="http://dl.iteye.com/upload/picture/pic/129498/c518b086-b144-366c-884c-58a4bf985b05.jpg" alt="" style="border:0px" height="527" width="584" />
		</p>
		<p style="">监控运行状态</p>
<img src ="http://www.blogjava.net/tingfeng/aggbug/432685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2017-07-25 10:35 <a href="http://www.blogjava.net/tingfeng/articles/432685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何编写多线程Socket程序 </title><link>http://www.blogjava.net/tingfeng/articles/432684.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Tue, 25 Jul 2017 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/432684.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/432684.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/432684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/432684.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/432684.html</trackback:ping><description><![CDATA[转自 http://blog.csdn.net/ooppookid/article/details/51711323<br /><br /><br /><h3 id="1如何编写多线程socket程序">1、如何编写多线程Socket程序</h3><p>了解Socket看这里：<a href="http://blog.csdn.net/ooppookid/article/details/51704681" target="_blank">Socket是什么</a><br />
多线程Socket与单线程类似，只是使用了<font color="#ff0000">多线程的方式</font>来管理连接，<font color="#ff0000">主线程负责接收连接</font>，在接到连接后变<font color="#ff0000">创建新的线程</font>，每个线程负责与自己的客户端进行通信。</p><p>了解单线程Socket看这里：<a href="http://blog.csdn.net/ooppookid/article/details/51711164" target="_blank">如何编写单多线程Socket程序</a></p><p>与单线程Socket例子相比来说，服务端可以与<font color="#ff0000">多个客户端</font>进行通信了，不过多线程频繁的创建与销毁便会带来<font color="#ff0000">很大的资源开销</font>，而系统的网络资源等都是有限的。因此一般会<font color="#ff0000">引入线程池</font>，可以在某种程度上重用线程，减少线程的创建和销毁的次数以<font color="#ff0000">减少开销</font>。</p><p>我们的代码也分为<font color="#ff0000">客户端和服务端</font>两部分。服务端的代码中包含了<font color="#ff0000">使用和不使用线程池</font>的两种方式。</p><p><font color="#33ccff">服务端代码</font>：</p><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; "> 1</span> <span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.io.BufferedReader;<br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.io.IOException;<br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.io.InputStreamReader;<br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.io.PrintWriter;<br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.net.ServerSocket;<br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.net.Socket;<br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.ExecutorService;<br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.Executors;<br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> SocketThreadPoolDemoServer {<br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> port </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">8000</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> ServerSocket serverSocket;<br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> ExecutorService executorService; </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 连接池</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">17</span> <span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">final</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> POOL_SIZE </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">; </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 连接池大小 , 若为 1 时最多支持 2 线程</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">19</span> <span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> SocketThreadPoolDemoServer() </span><span style="color: #0000FF; ">throws</span><span style="color: #000000; "> Exception {<br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">        serverSocket </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> ServerSocket(port);<br /></span><span style="color: #008080; ">22</span> <span style="color: #000000; ">        executorService </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() </span><span style="color: #000000; ">*</span><span style="color: #000000; "> POOL_SIZE);</span><span style="color: #008000; ">//</span><span style="color: #008000; "> 初始化线程池</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">23</span> <span style="color: #008000; "></span><span style="color: #000000; ">        System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">waitting connet<img src="http://www.blogjava.net/images/dot.gif" /></span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">24</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">25</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">26</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">27</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">28</span> <span style="color: #008000; ">     *<br /></span><span style="color: #008080; ">29</span> <span style="color: #008000; ">     * 接受连接<br /></span><span style="color: #008080; ">30</span> <span style="color: #008000; ">     *<br /></span><span style="color: #008080; ">31</span> <span style="color: #008000; ">     * </span><span style="color: #808080; ">@author</span><span style="color: #008000; "> sunjie at 2016年6月14日<br /></span><span style="color: #008080; ">32</span> <span style="color: #008000; ">     *<br /></span><span style="color: #008080; ">33</span> <span style="color: #008000; ">     </span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">34</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> service() {<br /></span><span style="color: #008080; ">35</span> <span style="color: #000000; ">        Socket socket </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">36</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">) {<br /></span><span style="color: #008080; ">37</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {<br /></span><span style="color: #008080; ">38</span> <span style="color: #000000; ">                socket </span><span style="color: #000000; ">=</span><span style="color: #000000; "> serverSocket.accept();<br /></span><span style="color: #008080; ">39</span> <span style="color: #000000; ">                executorService.execute(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Handler(socket)); </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 使用连接池<br /></span><span style="color: #008080; ">40</span> <span style="color: #008000; ">                </span><span style="color: #008000; ">//</span><span style="color: #008000; "> new Thread(new Handler(socket)).start();</span><span style="color: #008000; ">//</span><span style="color: #008000; "> 不使用连接池</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">41</span> <span style="color: #008000; "></span><span style="color: #000000; ">            } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (IOException e) {<br /></span><span style="color: #008080; ">42</span> <span style="color: #000000; ">                e.printStackTrace();<br /></span><span style="color: #008080; ">43</span> <span style="color: #000000; ">            }<br /></span><span style="color: #008080; ">44</span> <span style="color: #000000; ">        }<br /></span><span style="color: #008080; ">45</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">46</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">47</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">48</span> <span style="color: #008000; ">     *<br /></span><span style="color: #008080; ">49</span> <span style="color: #008000; ">     * 线程类，负责维持与一个客户端的通信<br /></span><span style="color: #008080; ">50</span> <span style="color: #008000; ">     *<br /></span><span style="color: #008080; ">51</span> <span style="color: #008000; ">     * </span><span style="color: #808080; ">@author</span><span style="color: #008000; "> sunjie at 2016年6月14日<br /></span><span style="color: #008080; ">52</span> <span style="color: #008000; ">     *<br /></span><span style="color: #008080; ">53</span> <span style="color: #008000; ">     </span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">54</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> Handler </span><span style="color: #0000FF; ">implements</span><span style="color: #000000; "> Runnable {<br /></span><span style="color: #008080; ">55</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">56</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> Socket socket </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">57</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">58</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> Handler(Socket socket) {<br /></span><span style="color: #008080; ">59</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.socket </span><span style="color: #000000; ">=</span><span style="color: #000000; "> socket;<br /></span><span style="color: #008080; ">60</span> <span style="color: #000000; ">        }<br /></span><span style="color: #008080; ">61</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">62</span> <span style="color: #000000; ">        @Override<br /></span><span style="color: #008080; ">63</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> run() {<br /></span><span style="color: #008080; ">64</span> <span style="color: #000000; ">            System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">new connection accepted:</span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> socket.getInetAddress() </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> socket.getPort());<br /></span><span style="color: #008080; ">65</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {<br /></span><span style="color: #008080; ">66</span> <span style="color: #000000; ">                BufferedReader reader </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> BufferedReader(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> InputStreamReader(socket.getInputStream(), </span><span style="color: #000000; ">"</span><span style="color: #000000; ">UTF-8</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br /></span><span style="color: #008080; ">67</span> <span style="color: #000000; ">                PrintWriter writer </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> PrintWriter(socket.getOutputStream());<br /></span><span style="color: #008080; ">68</span> <span style="color: #000000; ">                String msg </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">69</span> <span style="color: #000000; ">                </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> ((msg </span><span style="color: #000000; ">=</span><span style="color: #000000; "> reader.readLine()) </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {<br /></span><span style="color: #008080; ">70</span> <span style="color: #000000; ">                    System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">from </span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> socket.getInetAddress() </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> socket.getPort() </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; ">, receive msg:</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">71</span> <span style="color: #000000; ">                            </span><span style="color: #000000; ">+</span><span style="color: #000000; "> msg);<br /></span><span style="color: #008080; ">72</span> <span style="color: #000000; ">                    writer.println(msg);<br /></span><span style="color: #008080; ">73</span> <span style="color: #000000; ">                    writer.flush();<br /></span><span style="color: #008080; ">74</span> <span style="color: #000000; ">                    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (</span><span style="color: #000000; ">"</span><span style="color: #000000; ">close</span><span style="color: #000000; ">"</span><span style="color: #000000; ">.equals(msg)) {<br /></span><span style="color: #008080; ">75</span> <span style="color: #000000; ">                        </span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">76</span> <span style="color: #000000; ">                    }<br /></span><span style="color: #008080; ">77</span> <span style="color: #000000; ">                }<br /></span><span style="color: #008080; ">78</span> <span style="color: #000000; ">            } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (IOException e) {<br /></span><span style="color: #008080; ">79</span> <span style="color: #000000; ">                e.printStackTrace();<br /></span><span style="color: #008080; ">80</span> <span style="color: #000000; ">            } </span><span style="color: #0000FF; ">finally</span><span style="color: #000000; "> {<br /></span><span style="color: #008080; ">81</span> <span style="color: #000000; ">                </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {<br /></span><span style="color: #008080; ">82</span> <span style="color: #000000; ">                    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (socket </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {<br /></span><span style="color: #008080; ">83</span> <span style="color: #000000; ">                        socket.close();<br /></span><span style="color: #008080; ">84</span> <span style="color: #000000; ">                    }<br /></span><span style="color: #008080; ">85</span> <span style="color: #000000; ">                } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (IOException e) {<br /></span><span style="color: #008080; ">86</span> <span style="color: #000000; ">                    e.printStackTrace();<br /></span><span style="color: #008080; ">87</span> <span style="color: #000000; ">                }<br /></span><span style="color: #008080; ">88</span> <span style="color: #000000; ">            }<br /></span><span style="color: #008080; ">89</span> <span style="color: #000000; ">        }<br /></span><span style="color: #008080; ">90</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">91</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">92</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) </span><span style="color: #0000FF; ">throws</span><span style="color: #000000; "> Exception {<br /></span><span style="color: #008080; ">93</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> SocketThreadPoolDemoServer().service();<br /></span><span style="color: #008080; ">94</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">95</span> <span style="color: #000000; ">}<br /></span><span style="color: #008080; ">96</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">97</span> <span style="color: #000000; "></span></div><br /><p>运行服务端代码后，程序会<font color="#ff0000">一直进行监听</font>，直到接收到客户端请求为止。结果如下：</p><p>waitting connet…</p><p><font color="#33ccff">客户端代码</font>（与单线程完全相同）：</p><pre class="prettyprint" name="code"><code class="hljs cs has-numbering"><span class="hljs-keyword"><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; "> 1</span> <span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> SocketDemoClient {<br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> String host </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; ">127.0.0.1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;</span><span style="color: #008000; ">//</span><span style="color: #008000; "> 要发送给服务端的ip</span><span style="color: #008000; "><br /></span><span style="color: #008080; "> 4</span> <span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> port </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">8000</span><span style="color: #000000; ">;</span><span style="color: #008000; ">//</span><span style="color: #008000; "> 要发送给服务端的端口</span><span style="color: #008000; "><br /></span><span style="color: #008080; "> 6</span> <span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> Socket socket;<br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> SocketDemoClient() </span><span style="color: #0000FF; ">throws</span><span style="color: #000000; "> Exception {<br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">        socket </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Socket(host, port);</span><span style="color: #008000; ">//</span><span style="color: #008000; "> 构造Socket客户端，并与连接服务端</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">11</span> <span style="color: #008000; "></span><span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> talk() </span><span style="color: #0000FF; ">throws</span><span style="color: #000000; "> IOException {<br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {<br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">            BufferedReader reader </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> BufferedReader(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> InputStreamReader(socket.getInputStream(), </span><span style="color: #000000; ">"</span><span style="color: #000000; ">UTF-8</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">            PrintWriter writer </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> PrintWriter(socket.getOutputStream());<br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; ">            </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 读取本地控制台的消息</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">18</span> <span style="color: #008000; "></span><span style="color: #000000; ">            BufferedReader localReader </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> BufferedReader(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> InputStreamReader(System.in));<br /></span><span style="color: #008080; ">19</span> <span style="color: #000000; ">            String msg </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> ((msg </span><span style="color: #000000; ">=</span><span style="color: #000000; "> localReader.readLine()) </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {<br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">                writer.println(msg);<br /></span><span style="color: #008080; ">22</span> <span style="color: #000000; ">                writer.flush();<br /></span><span style="color: #008080; ">23</span> <span style="color: #000000; ">                System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">send msg:</span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> reader.readLine());<br /></span><span style="color: #008080; ">24</span> <span style="color: #000000; ">                </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (</span><span style="color: #000000; ">"</span><span style="color: #000000; ">close</span><span style="color: #000000; ">"</span><span style="color: #000000; ">.equals(msg)) {<br /></span><span style="color: #008080; ">25</span> <span style="color: #000000; ">                    </span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">26</span> <span style="color: #000000; ">                }<br /></span><span style="color: #008080; ">27</span> <span style="color: #000000; ">            }<br /></span><span style="color: #008080; ">28</span> <span style="color: #000000; ">        } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (Exception e) {<br /></span><span style="color: #008080; ">29</span> <span style="color: #000000; ">            e.printStackTrace();<br /></span><span style="color: #008080; ">30</span> <span style="color: #000000; ">        } </span><span style="color: #0000FF; ">finally</span><span style="color: #000000; "> {<br /></span><span style="color: #008080; ">31</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (socket </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {<br /></span><span style="color: #008080; ">32</span> <span style="color: #000000; ">                socket.close();<br /></span><span style="color: #008080; ">33</span> <span style="color: #000000; ">            }<br /></span><span style="color: #008080; ">34</span> <span style="color: #000000; ">        }<br /></span><span style="color: #008080; ">35</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">36</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">37</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) </span><span style="color: #0000FF; ">throws</span><span style="color: #000000; "> Exception {<br /></span><span style="color: #008080; ">38</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> SocketDemoClient().talk();<br /></span><span style="color: #008080; ">39</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">40</span> <span style="color: #000000; ">}</span></div><br /></span></code></pre><p>由于我们要<a href="http://lib.csdn.net/base/softwaretest" class="replace_word" title="软件测试知识库" target="_blank" style="color:#df3434; font-weight:bold;">测试</a>多个客户端连接同一个服务端，所以我们需要<font color="#ff0000">多次运行客户端代码</font>。这里我们运行两次之后（称为客户端1、客户端2），查看<font color="#ff0000">服务端的Console</font>，会出现以下结果，说明已经连接成功：</p><p>waitting connet… <br />
new connection accepted:/127.0.0.1:59593 <br />
new connection accepted:/127.0.0.1:59596</p><p>我们在去<font color="#ff0000">客户端1的Console</font>中输入我们要发送的消息”维护世界和平”，回车确定后，<font color="#ff0000">客户端1的Console</font>出现以下结果，消息已经发出：</p><p>send msg:维护世界和平</p><p>再去<font color="#ff0000">客户端2的Console</font>中输入”好好学习天天向上”，回车确定后，<font color="#ff0000">客户端2的Console</font>出现以下结果，消息已经发出：</p><p>send msg:好好学习天天向上</p><p>在服务端的Console中，我们会看到如下结果，说明两个客户端的<font color="#ff0000">消息已经被接受</font>：</p><p>waitting connet… <br />
new connection accepted:/127.0.0.1:59593 <br />
new connection accepted:/127.0.0.1:59596 <br />
from /127.0.0.1:59593, receive msg:维护世界和平 <br />
from /127.0.0.1:59596, receive msg:好好学习天天向上</p><img src ="http://www.blogjava.net/tingfeng/aggbug/432684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2017-07-25 10:30 <a href="http://www.blogjava.net/tingfeng/articles/432684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux嵌入式下安装java运行环境</title><link>http://www.blogjava.net/tingfeng/articles/432484.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Wed, 26 Apr 2017 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/432484.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/432484.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/432484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/432484.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/432484.html</trackback:ping><description><![CDATA[
		<div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: #000000; ">java version </span>
				<span style="color: #000000; ">"</span>
				<span style="color: #000000; ">1.5.0</span>
				<span style="color: #000000; ">"</span>
				<span style="color: #000000; ">
						<br />JamVM version </span>
				<span style="color: #000000; ">1.5</span>
				<span style="color: #000000; ">.</span>
				<span style="color: #000000; ">4</span>
				<span style="color: #000000; ">
						<br />Copyright (C) </span>
				<span style="color: #000000; ">2003</span>
				<span style="color: #000000; ">-</span>
				<span style="color: #000000; ">2010</span>
				<span style="color: #000000; "> Robert Lougher </span>
				<span style="color: #000000; ">&lt;</span>
				<span style="color: #000000; ">rob@jamvm.org.uk</span>
				<span style="color: #000000; ">&gt;</span>
				<span style="color: #000000; ">
						<br />
						<br />This program </span>
				<span style="color: #0000FF; ">is</span>
				<span style="color: #000000; "> free software; you can redistribute it </span>
				<span style="color: #0000FF; ">and</span>
				<span style="color: #000000; ">/</span>
				<span style="color: #0000FF; ">or</span>
				<span style="color: #000000; ">
						<br />modify it under the terms of the GNU General </span>
				<span style="color: #0000FF; ">Public</span>
				<span style="color: #000000; "> License<br /></span>
				<span style="color: #0000FF; ">as</span>
				<span style="color: #000000; "> published by the Free Software Foundation; either version </span>
				<span style="color: #000000; ">2</span>
				<span style="color: #000000; ">,<br /></span>
				<span style="color: #0000FF; ">or</span>
				<span style="color: #000000; "> (at your </span>
				<span style="color: #0000FF; ">option</span>
				<span style="color: #000000; ">) any later version.<br /><br />This program </span>
				<span style="color: #0000FF; ">is</span>
				<span style="color: #000000; "> distributed in the hope that it will be useful,<br />but WITHOUT ANY WARRANTY; without even the implied warranty of<br />MERCHANTABILITY </span>
				<span style="color: #0000FF; ">or</span>
				<span style="color: #000000; "> FITNESS </span>
				<span style="color: #0000FF; ">FOR</span>
				<span style="color: #000000; "> A PARTICULAR PURPOSE.  See the<br />GNU General </span>
				<span style="color: #0000FF; ">Public</span>
				<span style="color: #000000; "> License </span>
				<span style="color: #0000FF; ">for</span>
				<span style="color: #000000; "> more details.<br /><br />Build information:<br /><br />Execution Engine: direct</span>
				<span style="color: #000000; ">-</span>
				<span style="color: #000000; ">threaded interpreter </span>
				<span style="color: #0000FF; ">with</span>
				<span style="color: #000000; "> stack</span>
				<span style="color: #000000; ">-</span>
				<span style="color: #000000; ">caching<br />Compiled </span>
				<span style="color: #0000FF; ">with</span>
				<span style="color: #000000; ">: gcc </span>
				<span style="color: #000000; ">4.6</span>
				<span style="color: #000000; ">.</span>
				<span style="color: #000000; ">2</span>
				<span style="color: #000000; "> </span>
				<span style="color: #000000; ">20110630</span>
				<span style="color: #000000; "> (prerelease)<br /><br />Boot Library Path: </span>
				<span style="color: #000000; ">/</span>
				<span style="color: #000000; ">usr</span>
				<span style="color: #000000; ">/</span>
				<span style="color: #000000; ">classpath</span>
				<span style="color: #000000; ">/</span>
				<span style="color: #000000; ">lib</span>
				<span style="color: #000000; ">/</span>
				<span style="color: #000000; ">classpath<br />Boot Class Path: </span>
				<span style="color: #000000; ">/</span>
				<span style="color: #000000; ">usr</span>
				<span style="color: #000000; ">/</span>
				<span style="color: #000000; ">jamvm</span>
				<span style="color: #000000; ">/</span>
				<span style="color: #000000; ">share</span>
				<span style="color: #000000; ">/</span>
				<span style="color: #000000; ">jamvm</span>
				<span style="color: #000000; ">/</span>
				<span style="color: #000000; ">classes.zip:</span>
				<span style="color: #000000; ">/</span>
				<span style="color: #000000; ">usr</span>
				<span style="color: #000000; ">/</span>
				<span style="color: #000000; ">classpath</span>
				<span style="color: #000000; ">/</span>
				<span style="color: #000000; ">share</span>
				<span style="color: #000000; ">/</span>
				<span style="color: #000000; ">classpath</span>
				<span style="color: #000000; ">/</span>
				<span style="color: #000000; ">glibj.zip<br /></span>
		</div>交叉编译环境前提已经搭建好<br /><br />各个软件版本及下载地址：<br />       GNU Classpath 0.98  http://www.gnu.org/software/classpath/downloads/downloads.html<br />       JVM 1.54  https://sourceforge.net/projects/jamvm/files/jamvm/<br />       zlib  1.2.11 http://www.zlib.net/<br />       libffi 3.2 ftp://sourceware.org/pub/libffi/<br /><br />编译过程：<br /> 一、编译gnu classpath<br />         前提：<br />         1、在/usr下创建classpath文件夹，并赋予权限 ：sudo chmod 777 /usr/classpath -R<br />         2、将文件解压并将文件夹赋予权限 sudo chmod 777 ~/software/classpath-0.98 -R<br />         编译安装：<br />         1、./configure --prefix=/usr/javatools --host=arm-none-linux-gnueabi 
--disable-examples --without-x --disable-qt-peer --disable-gtk-peer 
--disable-gconf-peer --disable-plugin --disable-alsa --disable-dssi 
--disable-Werror --disable-tools<br />          <br />          说明：直接执行，会报错conditional "GCJ_JAVAC" was never defined.<span style="font-family:宋体"><br />           根据百度的结果，解决方式是假设</span>GCJ<span style="font-family:宋体">没有定义，但是它也没有用到过，则就在.configure文件中把那个</span><span style="font-family:Calibri">if</span><span style="font-family:宋体">判断用</span><span style="font-family:Calibri">#</span><span style="font-family:宋体">屏蔽了</span><br />         2、make &amp; make install<br />  <br />二、编译zlib<br />         前提：<br />          1、在/usr下创建zlib文件夹，并赋予权限：sudo chmod 777 /usr/zlib -R<br />          2、将文件解压并将文件夹赋予权限：sudo chmod 777 ~/software/zlib-1.2.11 -R<br />          编译安装：<br />          1、<br />                export CC=arm-linux-gcc<br />                ./configure --prefix=/usr/zlib<br />           2、make &amp; make install<br /><br />三、编译libffi<br />         前提：<br />          1、将libffi同样安装在/usr/zlib文件夹下<br />          2、将文件解压并将文件夹赋予权限：sudo chmod 777 ~/software/libffi-3.2 -R<br /><br />          编译安装：<br />          1、./configure --prefix=/usr/zlib --host=arm-none-linux-gnueabi<br />          2、make &amp; make install<br /><br />          拷贝文件：<br /><span style="color:rgb(51,51,51)"><span style="font-family:宋体">     将</span><span style="font-family:Verdana">/usr/zlib/lib/libffi-3.2/include/
  </span><span style="font-family:宋体">将里面的</span><span style="font-family:Verdana">ffi.h ffitarget.h
</span><span style="font-family:宋体">复制到</span><span style="font-family:Verdana">/usr/zlib/include</span><span style="font-family:宋体">中。<br /><br />四、编译jvm</span></span>           <br />         前提：<br />          1、在/usr下创建jamvm文件夹，并赋予权限：sudo chmod 777 /usr/jamvm -R<br />          2、将文件解压并将文件夹赋予权限：sudo chmod 777 ~/software/jamvm-1.54 -R<br /><br />          编译安装：<br />          1、./configure --prefix=/usr/jamvm --with-classpath-install-dir=/usr/classpath --enable-ffi --disable-int-inlining --host=arm-none-linux-gnueabi CFLAGS=-I/usr/zlib/include LDFLAGS=-L/usr/zlib/lib <br />           2、make &amp; make install<br /><br />安装到开发板并配置环境变量<br /><br />          1、<span style="font-family:宋体">将</span><span style="font-family:Calibri">classpath</span><span style="font-family:宋体">和</span><span style="font-family:Calibri">jamvm</span><span style="font-family:宋体">两个文件夹复制到开发板的
</span><span style="font-family:Calibri">/usr</span><span style="font-family:宋体">目录下面<br /><br />     2、将zlib/lib中的所有文件夹和文件拷贝到开发板的/usr/lib/目录下面<br /><br />     3、配置环境变量<br />           </span>export PATH=$PATH:/usr/jamvm/bin<br /><br />                       jamvm -version<br />打印版本信息如下：<br /><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000; ">java version </span><span style="color: #000000; ">"</span><span style="color: #000000; ">1.5.0</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />JamVM version </span><span style="color: #000000; ">1.5</span><span style="color: #000000; ">.</span><span style="color: #000000; ">4</span><span style="color: #000000; "><br />Copyright (C) </span><span style="color: #000000; ">2003</span><span style="color: #000000; ">-</span><span style="color: #000000; ">2010</span><span style="color: #000000; "> Robert Lougher </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">rob@jamvm.org.uk</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br />This program </span><span style="color: #0000FF; ">is</span><span style="color: #000000; "> free software; you can redistribute it </span><span style="color: #0000FF; ">and</span><span style="color: #000000; ">/</span><span style="color: #0000FF; ">or</span><span style="color: #000000; "><br />modify it under the terms of the GNU General </span><span style="color: #0000FF; ">Public</span><span style="color: #000000; "> License<br /></span><span style="color: #0000FF; ">as</span><span style="color: #000000; "> published by the Free Software Foundation; either version </span><span style="color: #000000; ">2</span><span style="color: #000000; ">,<br /></span><span style="color: #0000FF; ">or</span><span style="color: #000000; "> (at your </span><span style="color: #0000FF; ">option</span><span style="color: #000000; ">) any later version.<br /><br />This program </span><span style="color: #0000FF; ">is</span><span style="color: #000000; "> distributed in the hope that it will be useful,<br />but WITHOUT ANY WARRANTY; without even the implied warranty of<br />MERCHANTABILITY </span><span style="color: #0000FF; ">or</span><span style="color: #000000; "> FITNESS </span><span style="color: #0000FF; ">FOR</span><span style="color: #000000; "> A PARTICULAR PURPOSE.  See the<br />GNU General </span><span style="color: #0000FF; ">Public</span><span style="color: #000000; "> License </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> more details.<br /><br />Build information:<br /><br />Execution Engine: direct</span><span style="color: #000000; ">-</span><span style="color: #000000; ">threaded interpreter </span><span style="color: #0000FF; ">with</span><span style="color: #000000; "> stack</span><span style="color: #000000; ">-</span><span style="color: #000000; ">caching<br />Compiled </span><span style="color: #0000FF; ">with</span><span style="color: #000000; ">: gcc </span><span style="color: #000000; ">4.6</span><span style="color: #000000; ">.</span><span style="color: #000000; ">2</span><span style="color: #000000; "> </span><span style="color: #000000; ">20110630</span><span style="color: #000000; "> (prerelease)<br /><br />Boot Library Path:<font color="#FF0000"> </font></span><font color="#FF0000">/usr/classpath/lib/</font><span style="color: #000000; "><font color="#FF0000">classpath</font><br />Boot Class Path:<font color="#FF0000"> </font></span><font color="#FF0000">/usr/jamvm/share/jamvm/classes.zip:/usr/classpath/share/classpath/</font><span style="color: #000000; "><font color="#FF0000">glibj.zip</font><br /></span></div>                       将红色部分设置到环境变量中：<br /><p>                      export LD_LIBRARY_PATH=<strong>/usr/classpath/lib/classpath:$LD_LIBRARY_PATH</strong></p><p>                      export  BOOTCLASSPATH=<strong>/usr/jamvm/share/jamvm/classes.zip:/usr/classpath/share/classpath/glibj.zip</strong></p>                       该命令可以每次都执行一次，也可以写到开发板的启动文件中，这样就不用每次都手动执行。启动文件不同开发板不一样，自己去添加环境变量，此处不再叙述。<br /><br />java程序：<br />      <div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> HelloWorld {<br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args){<br />        System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hello World!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />    }<br />}</span></div><br />       编译 javac HelloWorld<br />       将生成的HelloWorld.class拷贝到开发板上执行jamvm HelloWorld<br />       打印Hello World!<br /><br /><br /><br />遇到的问题：<br />        1、执行config和make主要是三类问题，没有执行权限，利用chmod 777 将文件夹所有权限赋值；缺少依赖库，主要是zlib和ffi，下载安装即可；config配置错误，按照当前的没有问题；<br />        2、库拷贝问题，zlib/lib库未拷贝，会产生找不到lib库的问题；<br />        3、执行的时候还报如下错误，可能三种原因导致：环境变量设置错误；classpath和jamvm版本不正确；java程序的位置不对。<br />                  Exceptionoccurred while VM initialising<br />                 
<a href="http://lib.csdn.net/base/javase" class="replace_word" title="Java SE知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java</a>/lang/NoClassDefFoundError: java/lang/Thread <br />        4、之前试了classpath0.99和jamvm2.0.0，一直报第三个错误，直到变成当前的版本，坑啊！<br />        5、java程序的位置不要定义包就好了。<br />           <br /><br /><img src ="http://www.blogjava.net/tingfeng/aggbug/432484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2017-04-26 17:25 <a href="http://www.blogjava.net/tingfeng/articles/432484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】geoserver扫盲 openlayers相关</title><link>http://www.blogjava.net/tingfeng/articles/317822.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Fri, 09 Apr 2010 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/317822.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/317822.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/317822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/317822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/317822.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自http://www.cnblogs.com/lzlynn/archive/2008/07/29/1255702.html																				WMS: Web Map Service												（														Web												地图服务																		）				...&nbsp;&nbsp;<a href='http://www.blogjava.net/tingfeng/articles/317822.html'>阅读全文</a><img src ="http://www.blogjava.net/tingfeng/aggbug/317822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2010-04-09 10:21 <a href="http://www.blogjava.net/tingfeng/articles/317822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】Servlet多线程机制</title><link>http://www.blogjava.net/tingfeng/articles/310323.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Thu, 21 Jan 2010 02:18:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/310323.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/310323.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/310323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/310323.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/310323.html</trackback:ping><description><![CDATA[http://www.gold98.net/blog/article.asp?id=129<br />摘&nbsp;要：介绍了Servlet多线程机制，通过一个实例并结合Java&nbsp;的内存模型说明引起Servlet线程不安全的原因，给出了保证Servlet线程安全的三种解决方案，并说明三种方案在实际开发中的取舍。<br /><br />　　关键字：Servlet&nbsp;线程安全&nbsp;同步&nbsp;Java内存模型&nbsp;实例变量&nbsp;<br /><br />　
　Servlet/JSP技术和ASP、PHP等相比，由于其多线程运行而具有很高的执行效率。由于Servlet/JSP默认是以多线程模式执行的，所
以，在编写代码时需要非常细致地考虑多线程的安全性问题。然而，很多人编写Servlet/JSP程序时并没有注意到多线程安全性的问题，这往往造成编写
的程序在少量用户访问时没有任何问题，而在并发用户上升到一定值时，就会经常出现一些莫明其妙的问题。<br /><br />　　Servlet的多线程机制<br />　&nbsp;<br />　　Servlet体系结构是建立在Java多线程机制之上的，它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时，Servlet容器将会根据web.<a target="_blank" href="http://www.gold98.net/blog/default.asp?tag=xml">xml</a>配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时，一般不会再实例化该Servlet类，也就是有多个线程在使用这个实例。Servlet容器会自动使用线程池等技术来支持系统的运行，如图1所示。<br /><br /><img src="http://www.gold98.net/blog/attachments/month_0702/k20072278415.jpg" alt="" border="0" /><br /><br /><br />图1&nbsp;Servlet线程池&nbsp;<br /><br />　　这样，当两个或多个线程同时访问同一个Servlet时，可能会发生多个线程同时访问同一资源的情况，数据可能会变得不一致。所以在用Servlet构建的Web应用时如果不注意线程安全的问题，会使所写的Servlet程序有难以发现的错误。<br /><br />　　Servlet的线程安全问题<br /><br />　　Servlet的线程安全问题主要是由于实例变量使用不当而引起的，这里以一个现实的例子来说明。<br /><br />Import&nbsp;javax.servlet.&nbsp;*;&nbsp;<br />Import&nbsp;javax.servlet.http.&nbsp;*;&nbsp;<br />Import&nbsp;java.io.&nbsp;*;&nbsp;<br />Public&nbsp;class&nbsp;Concurrent&nbsp;Test&nbsp;extends&nbsp;HttpServlet&nbsp;{PrintWriter&nbsp;output;&nbsp;<br />Public&nbsp;void&nbsp;service&nbsp;(HttpServletRequest&nbsp;request,<br />HttpServletResponse&nbsp;response)&nbsp;throws&nbsp;ServletException,&nbsp;IOException&nbsp;{String&nbsp;username;<br />Response.setContentType&nbsp;("text/html;&nbsp;charset=gb2312");<br />Username&nbsp;=&nbsp;request.getParameter&nbsp;("username");&nbsp;<br />Output&nbsp;=&nbsp;response.getWriter&nbsp;();&nbsp;<br />Try&nbsp;{Thread.&nbsp;sleep&nbsp;(5000);&nbsp;//为了突出并发问题，在这设置一个延时<br />}&nbsp;Catch&nbsp;(Interrupted&nbsp;Exception&nbsp;e){}<br />output.println("用户名:"+Username+"&lt;BR&gt;");&nbsp;<br />}<br />}&nbsp;<br /><br />　
　该Servlet中定义了一个实例变量output，在service方法将其赋值为用户的输出。当一个用户访问该Servlet时，程序会正常的运
行，但当多个用户并发访问时，就可能会出现其它用户的信息显示在另外一些用户的浏览器上的问题。这是一个严重的问题。为了突出并发问题，便于测试、观察，<a target="_blank" href="http://www.gold98.net/">我</a>们在回显用户信息时执行了一个延时的操作。假设已在web.<a target="_blank" href="http://www.gold98.net/blog/default.asp?tag=xml">xml</a>配置文件中注册了该Servlet，现有两个用户a和b同时访问该Servlet（可以启动两个IE浏览器，或者在两台机器上同时访问）,即同时在浏览器中输入：<br /><br />　　a：&nbsp;<a href="http://localhost/" target="_blank">http://localhost:</a>&nbsp;8080/servlet/ConcurrentTest?&nbsp;Username=a<br /><br />　　b：&nbsp;<a href="http://localhost/" target="_blank">http://localhost:</a>&nbsp;8080/servlet/ConcurrentTest?&nbsp;Username=b<br /><br />　　如果用户b比用户a回车的时间稍慢一点，将得到如图2所示的输出：<br /><br /><img style="cursor: pointer;" title="在新窗口打开图片" src="http://www.gold98.net/blog/attachments/month_0702/a200722784133.jpg" alt="" border="0" /><br /><br />图2&nbsp;a用户和b用户的浏览器输出&nbsp;<br /><br />　　从图2中可以看到，Web服务器启动了两个线程分别处理来自用户a和用户b的请求，但是在用户a的浏览器上却得到一个空白的屏幕，用户a的信息显示在用户b的浏览器上。该Servlet存在线程不安全问题。下面<a target="_blank" href="http://www.gold98.net/">我</a>们就从分析该实例的内存模型入手,观察不同时刻实例变量output的值来分析使该Servlet线程不安全的原因。<br /><br />　
　Java的内存模型JMM（Java&nbsp;MemoryModel）JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计，系统存在一个主内
存(Main&nbsp;Memory)，Java中所有实例变量都储存在主存中，对于所有线程都是共享的。每条线程都有自己的工作内存
(Working&nbsp;Memory)，工作内存由缓存和堆栈两部分组成，缓存中保存的是主存中变量的拷贝，缓存可能并不总和主存同步，也就是缓存中变量的修
改可能没有立刻写到主存中；堆栈中保存的是线程的局部变量，线程之间无法相互直接访问堆栈中的变量。根据JMM，<a target="_blank" href="http://www.gold98.net/">我</a>们可以将论文中所讨论的Servlet实例的内存模型抽象为图3所示的模型。<br /><br /><img src="http://www.gold98.net/blog/attachments/month_0702/u200722784156.jpg" alt="" border="0" /><br /><br />图3&nbsp;Servlet实例的JMM模型&nbsp;<br /><br />　　下面根据图3所示的内存模型，来分析当用户a和b的线程（简称为a线程、b线程）并发执行时，Servlet实例中所涉及变量的变化情况及线程的执行情况，如图4所示。<br /><br />调度时刻&nbsp;&nbsp;a线程&nbsp;b线程&nbsp;<br />T1&nbsp;访问Servlet页面&nbsp;&nbsp;&nbsp;<br />T2&nbsp;&nbsp;&nbsp;&nbsp;访问Servlet页面&nbsp;<br />T3&nbsp;&nbsp;output=a的输出username=a休眠5000毫秒，让出CPU&nbsp;&nbsp;&nbsp;&nbsp;<br />T4&nbsp;&nbsp;&nbsp;&nbsp;output=b的输出（写回主存）username=b休眠5000毫秒，让出CPU&nbsp;<br />T5&nbsp;&nbsp;在用户b的浏览器上输出a线程的username的值,a线程终止。&nbsp;&nbsp;&nbsp;&nbsp;<br />T6&nbsp;&nbsp;&nbsp;在用户b的浏览器上输出b线程的username的值,b线程终止。&nbsp;<br />　　　　　　　　　　　　　　　　　　图4&nbsp;Servlet实例的线程调度情况<br /><br />　
　从图4中可以清楚的看到，由于b线程对实例变量output的修改覆盖了a线程对实例变量output的修改，从而导致了用户a的信息显示在了用户b的
浏览器上。如果在a线程执行输出语句时，b线程对output的修改还没有刷新到主存，那么将不会出现图2所示的输出结果，因此这只是一种偶然现象，但这
更增加了程序潜在的危险性。&nbsp;<br />设计线程安全的Servlet<br /><br />　　通过上面的分析，<a target="_blank" href="http://www.gold98.net/">我</a>们知道了实例变量不正确的使用是造成Servlet线程不安全的主要原因。下面针对该问题给出了三种解决方案并对方案的选取给出了一些参考性的建议。<br /><br />　　1、实现&nbsp;SingleThreadModel&nbsp;接口<br /><br />　
　该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不
会有两个线程被同时执行，当然也就不存在线程安全的问题。这种方法只要将前面的Concurrent&nbsp;Test类的类头定义更改为：<br /><br />Public&nbsp;class&nbsp;Concurrent&nbsp;Test&nbsp;extends&nbsp;HttpServlet&nbsp;implements&nbsp;SingleThreadModel&nbsp;{<br />&#8230;&#8230;&#8230;&#8230;<br />}&nbsp;&nbsp;<br /><br />　　2、同步对共享数据的操作<br /><br />　　使用synchronized&nbsp;关键字能保证一次只有一个线程可以访问被保护的区段，在本论文中的Servlet可以通过同步块操作来保证线程的安全。同步后的代码如下：&nbsp;<br /><br />&#8230;&#8230;&#8230;&#8230;<br />Public&nbsp;class&nbsp;Concurrent&nbsp;Test&nbsp;extends&nbsp;HttpServlet&nbsp;{&nbsp;&#8230;&#8230;&#8230;&#8230;<br />Username&nbsp;=&nbsp;request.getParameter&nbsp;("username");&nbsp;<br />Synchronized&nbsp;(this){<br />Output&nbsp;=&nbsp;response.getWriter&nbsp;();&nbsp;<br />Try&nbsp;{<br />Thread.&nbsp;Sleep&nbsp;(5000);<br />}&nbsp;Catch&nbsp;(Interrupted&nbsp;Exception&nbsp;e){}<br />output.println("用户名:"+Username+"&lt;BR&gt;");&nbsp;<br />}&nbsp;<br />}<br />}&nbsp;<br /><br />　　3、避免使用实例变量<br /><br />　　本实例中的线程安全问题是由实例变量造成的，只要在Servlet里面的任何方法里面都不使用实例变量，那么该Servlet就是线程安全的。<br /><br />　　修正上面的Servlet代码，将实例变量改为局部变量实现同样的功能，代码如下：<br /><br />&#8230;&#8230;&nbsp;<br />Public&nbsp;class&nbsp;Concurrent&nbsp;Test&nbsp;extends&nbsp;HttpServlet&nbsp;{public&nbsp;void&nbsp;service&nbsp;(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;<br />Response)&nbsp;throws&nbsp;ServletException,&nbsp;IOException&nbsp;{<br />Print&nbsp;Writer&nbsp;output;&nbsp;<br />String&nbsp;username;<br />Response.setContentType&nbsp;("text/html;&nbsp;charset=gb2312");<br />&#8230;&#8230;&nbsp;<br />}&nbsp;<br />}&nbsp;<br /><br />　
　对上面的三种方法进行测试，可以表明用它们都能设计出线程安全的Servlet程序。但是，如果一个Servlet实现了
SingleThreadModel接口，Servlet引擎将为每个新的请求创建一个单独的Servlet实例，这将引起大量的系统开销。
SingleThreadModel在Servlet2.4中已不再提倡使用；同样如果在程序中使用同步来保护要使用的共享的数据，也会使系统的性能大大
下降。这是因为被同步的代码块在同一时刻只能有一个线程执行它，使得其同时处理客户请求的吞吐量降低，而且很多客户处于阻塞状态。另外为保证主存内容和线
程的工作内存中的数据的一致性，要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化&nbsp;Servlet&nbsp;中的同步代码；在
Serlet中避免使用实例变量是保证Servlet线程安全的最佳选择。从Java&nbsp;内存模型也可以知道，方法中的临时变量是在栈上分配空间，而且每个
线程都有自己私有的栈空间，所以它们不会影响线程的安全。<br /><br />　　小结<br /><br />　　Servlet的线程安全问题只有在大量的并发访
问时才会显现出来，并且很难发现，因此在编写Servlet程序时要特别注意。线程安全问题主要是由实例变量造成的,因此在Servlet中应避免使用实
例变量。如果应用程序设计无法避免使用实例变量，那么使用同步来保护要使用的实例变量，但为保证系统的最佳性能，应该同步可用性最小的代码路径。<img src ="http://www.blogjava.net/tingfeng/aggbug/310323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2010-01-21 10:18 <a href="http://www.blogjava.net/tingfeng/articles/310323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】Servlet多线程安全问题</title><link>http://www.blogjava.net/tingfeng/articles/310321.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Thu, 21 Jan 2010 02:15:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/310321.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/310321.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/310321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/310321.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/310321.html</trackback:ping><description><![CDATA[http://blog.csdn.net/qfs_v/archive/2008/07/15/2652097.aspx<br />一，servlet容器如何同时处理多个请求。
<p>Servlet采用多线程来处理多个请求同时访问，Servelet容器维护了一个线程池来服务请求。<br />线程池实际上是等待执行代码的一组线程叫做工作者线程(Worker Thread)，Servlet容器使用一个调度线程来管理工作者线程(Dispatcher Thread)。</p><p>当容器收到一个访问Servlet的请求，调度者线程从线程池中选出一个工作者线程，将请求传递给该线程，然后由该线程来执行Servlet的service方法。<br />当这个线程正在执行的时候，容器收到另外一个请求，调度者线程将从池中选出另外一个工作者线程来服务新的请求，容器并不关系这个请求是否访问的是同一个Servlet还是另外一个Servlet。<br />当容器同时收到对同一Servlet的多个请求，那这个Servlet的service方法将在多线程中并发的执行。</p><p><br />二，Servlet容器默认采用单实例多线程的方式来处理请求，这样减少产生Servlet实例的开销，提升了对请求的响应时间。对于Tomcat可以在server.xml中通过&lt;Connector&gt;元素设置线程池中线程的数目。</p><p>就实现来说：<br />&nbsp;&nbsp;调度者线程类所担负的责任如其名字，该类的责任是调度线程，只需要利用自己的属性完成自己的责任。所以该类是承担了责任的，并且该类的责任又集中到唯一的单体对象中。<br />而其他对象又依赖于该特定对象所承担的责任，我们就需要得到该特定对象。那该类就是一个单例模式的实现了。</p><p>三，如何开发线程安全的
Servlet&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;&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;&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;&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;
<br />&nbsp;1，变量的线程安全：这里的变量指字段和共享数据(如表单参数值)。</p><p>&nbsp;&nbsp;a，将 参数变量 本地化。多线程并不共享局部变量.所以我们要尽可能的在servlet中使用局部变量。<br />&nbsp;&nbsp;&nbsp;例如：String user = "";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user = request.getParameter("user"); </p><p>&nbsp;&nbsp;b，使用同步块Synchronized，防止可能异步调用的代码块。这意味着线程需要排队处理。<br />&nbsp;&nbsp;在使用同板块的时候要尽可能的缩小同步代码的范围，不要直接在sevice方法和响应方法上使用同步，这样会严重影响性能。</p><p>&nbsp;</p><p>&nbsp;2,属性的线程安全：ServletContext，HttpSession，ServletRequest对象中属性<br />&nbsp;&nbsp;ServletContext：（线程是不安全的）<br />&nbsp;&nbsp;&nbsp;ServletContext是可以多线程同时读/写属性的，线程是不安全的。要对属性的读写进行同步处理或者进行深度Clone()。<br />&nbsp;&nbsp;&nbsp;所以在Servlet上下文中尽可能少量保存会被修改（写）的数据，可以采取其他方式在多个Servlet中共享，比方我们可以使用单例模式来处理共享数据。<br />&nbsp;&nbsp;HttpSession：（线程是不安全的）<br />&nbsp;&nbsp;&nbsp;HttpSession对象在用户会话期间存在，只能在处理属于同一个Session的请求的线程中被访问，因此Session对象的属性访问理论上是线程安全的。<br />&nbsp;&nbsp;&nbsp;当用户打开多个同属于一个进程的浏览器窗口，在这些窗口的访问属于同一个Session，会出现多次请求，需要多个工作线程来处理请求，可能造成同时多线程读写属性。<br />&nbsp;&nbsp;&nbsp;这时我们需要对属性的读写进行同步处理：使用同步块Synchronized和使用读/写器来解决。</p><p>&nbsp;&nbsp;ServletRequest：（线程是安全的）<br />&nbsp;&nbsp;&nbsp;对于每一个请求，由一个工作线程来执行，都会创建有一个新的ServletRequest对象，所以ServletRequest对象只能在一个线程中被访问。ServletRequest是线程安全的。<br />&nbsp;&nbsp;&nbsp;注意：ServletRequest对象在service方法的范围内是有效的，不要试图在service方法结束后仍然保存请求对象的引用。</p><p>&nbsp;3，使用同步的集合类：<br />&nbsp;&nbsp;使用Vector代替ArrayList，使用Hashtable代替HashMap。</p><p>&nbsp;4，不要在Servlet中创建自己的线程来完成某个功能。<br />&nbsp;&nbsp;Servlet本身就是多线程的，在Servlet中再创建线程，将导致执行情况复杂化，出现多线程安全问题。</p><p>&nbsp;5，在多个servlet中对外部对象(比方文件)进行修改操作一定要加锁，做到互斥的访问。&nbsp;</p><p>四，SingleThreadModel接口<br />&nbsp;javax.servlet.SingleThreadModel接口是一个标识接口，如果一个Servlet实现了这个接口，那Servlet容器将保证在一个时刻仅有一个线程可以在给定的servlet实例的service方法中执行。将其他所有请求进行排队。<br />&nbsp;服务器可以使用多个实例来处理请求，代替单个实例的请求排队带来的效益问题。服务器创建一个Servlet类的多个Servlet实例组成的实例池，对于每个请求分配Servlet实例进行响应处理，之后放回到实例池中等待下此请求。这样就造成并发访问的问题。<br />&nbsp;此时,局部变量(字段)也是安全的，但对于全局变量和共享数据是不安全的，需要进行同步处理。而对于这样多实例的情况SingleThreadModel接口并不能解决并发访问问题。<br />&nbsp;<br />&nbsp;SingleThreadModel接口在servlet规范中已经被废弃了。</p><img src ="http://www.blogjava.net/tingfeng/aggbug/310321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2010-01-21 10:15 <a href="http://www.blogjava.net/tingfeng/articles/310321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sdfasdf</title><link>http://www.blogjava.net/tingfeng/articles/310047.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Tue, 19 Jan 2010 03:21:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/310047.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/310047.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/310047.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/310047.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/310047.html</trackback:ping><description><![CDATA[1，新娘次日一大早痛苦的从洞房走出，一手扶墙，一手捂着下身大骂：真是个骗子！婚前说有三十年积蓄，我还以为是钱呢！ <br />　　 <br />　　2，一人自幼家贫光腚，其母用米袋做内裤，洞房夜脱去长裤，其妻当场昏倒，内裤前面赫然标明：净重30公斤。 <br />　　 <br />　　3，赖昌星和杨钰莹海边散步，赖指着远处的军舰说：这几年我在你身上花的钱够买这艘军舰了。杨钰莹说：这几年你在我身上打的炮也可以把这军舰炸沉！ <br />　　 <br />　　4，我看到一条短信好好笑 <br />　　说来听听嘛 <br />　　可是有点黄色 <br />　　黄色的地方就跳过嘛 <br />　　跳过跳过跳过跳过跳过，讲完了～～～ <br />　　 <br />　　5，农家有客来，主人想杀公鸡，可公鸡飞上屋顶不下来，主人骂道：再不下来，我把母鸡全杀了，让你生不如死！公鸡狂笑道：靠，老子终于可以找野鸡了！ <br />　　 <br />　　6，女记者问农场主人疯牛病的由来，农场主说：“我一天挤十次奶，母牛一年只交配一回”，记者不解，农场主大声说：天天揉你乳房，一年只X你一次，你不疯啊？ <br />　　 <br />　　7，女人三字经：死远些，别碰我，放开手，我喊了，你讨厌，不可以，不要嘛，你轻点，好舒服，不要停，用力点，不行了，抱紧我，要来了，快咬我，我还要………… <br />　　 <br />　　8，乡下来的小保姆看见床上一个用过的避孕套，不知何物，女主人轻蔑的说：你们乡下人不****么？保姆说：也做，但是没你们这个激烈，搞到脱皮。 <br />　　 <br />　　9，女子监狱发生暴动，警察眼看难以控制局面，监狱长拿过话筒，大喊一句，犯人们立刻平息了，她喊的是：“你们再闹下去，今天晚餐的黄瓜就切片！” <br />　　 <br />　　10，尼姑养的鹰把和尚菜园的桶、瓢、叉都偷跑了，和尚生气抓住这只鹰，拔光它的毛，尼姑心疼过来吵架，她说：你要桶，我给你桶，你要瓢，我给你瓢，你要叉，我给你叉，可是你干吗拔光我的鹰毛？ <br />　　 <br />　　11，一只蚊子和一只蟑螂偷看一个少女洗澡，蚊子吹牛说：我十年前在她胸前叮了两个包，现在居然肿这么大了。蟑螂说：那有什么了不起，十年前我在她下面砍了一刀，现在她每个月都出一次血！ <br />　　 <br />　　12，一个吸血鬼长得太丑，勾引不到女人，郁郁而终，死后他哀求上帝让我来世变成像天使那样洁白可爱，还要有两个翅膀，并且随时可以喝到少女的血。他的愿望实现了，他变成了一包护翼型卫生巾。<br />    13，某男拿女医生所开处方转了半天回来问：“13超到底在哪？”女医生笑曰：“不是13超，是B超。”男大怒曰：“靠，你的‘B"分得也太开了！”<br />    14，一女兵装男兵打仗，突来月经，血流股间，连长见状忙问：“怎么了？哪里受伤了？”女兵说：”没事，没事。”连长不信，强行扒下其裤子一看！大怒道：“他吗的鸡吧都给炸飞了！还说没事！”<br />
15，王师傅坐公共汽车到某市的高潮镇。因没去过所以刚过二站就开始问女售票员：“高潮到了没有？”女售票员答：“没有。”过了二站后，王师傅又问：“高
潮到了没有？”女售票员答：“没有。”没过几分钟，王师傅又问：“高潮到了没有？”这时，女售票员实在是不耐烦了。高声地回答道：“高潮到了，我会叫
的！”话音刚落，举座皆惊。目光一齐投向女售票员。<br />    16，一排妓女在街边等客，一位八旬老妇见到了,好奇的问：你们在等什么？妓女没好气的说：等棒棒糖！老妇也就排队加入队伍等糖，结果被警察抓，警察问老妇：你牙都没了也能？老妇笑着曰：我可以舔的！！<br />    17，一男青年在公交车上看到一美女的衣领开得很低,春光外泄,戏言道‘真是桃花盛开的地方啊’美女听后,撩起裙子说:‘还有生你养你的地方’！<br />    18，一小姐吃饭时点了道爆炒狗鞭,夹菜时不慎掉到两腿之间,小姐大惊:这玩意真厉害!煮熟了剁碎了,它竟还认识路！<br />    19，幼儿园小芳老师指着黑板上:m,a,y,d,b几个拼音考考小朋友, 小朋友们用最标准的发音说:"摸-阿-姨-的-逼"！！<br />    20，一女地下工作者被捕, 被逼写信引首长上钩，女地下工作者逼于无奈只有写, 写完后偷偷从私处拨了几根B毛夹在信中,首长看完信后, 拿着B毛闻一闻，瞅一瞅，苦思冥想，沉思片刻突然恍然大悟: 原来是：阴（毛）谋！！<br />
21，某漂亮MM跑进游泳池时不小心挂破泳衣，众男生见状就瞪着她直瞧．．．此时漂亮MM沿着池边走，发觉有异，顺手抓起一块牌子遮住重点部位．．．
此时男生们哈哈大笑！漂亮MM觉得奇怪，后来发现牌子上写着＂男士专用＂，赶快换面。可是当她换面的时候，男士们笑声更大，原来．．．那牌子上写着＂此处
深二米＂！<br />    22，一只大象问骆驼:‘你的咪咪怎么长在背上？’骆驼说:‘死远点，我不和鸡吧长在脸上的东西讲话！<br />    23，小女孩总是向小男孩炫耀自己的新玩具.小男孩没办法,只好脱掉裤子说:这个你永远没有!女孩也脱掉裤子说:我说只要有这个,你那玩意儿要多少有多少! <br /><br />1、老公要出差半年，贤妻收拾行李。完毕，深情地交给老公一包安全套说道：在外面实在忍不住的话记住一定带套，老公听罢激动地说：家里不宽裕还是用她们的吧。<br /><br />2、某男看到一则广告：不开刀、不住院、让你的生殖器轻轻松松变大变粗！顿大喜，立即汇款。数日，收到邮包，急切地打开一看！操！原来是一放大镜！<br /><br />3、牧师问一对夫妇：如果五分钟后就到世界末日，你们想做什么事？丈夫兴致勃勃地回答：想****。太太白他一眼幽幽地说：那剩下的四分钟干什么？<br />4、诊断女人外遇绝窍：工作心不在焉，回家给老公摔脸，孩子学习不管，炒菜常多放盐。经常托辞体乏，不让老公沾边。半月****一次，既不呻吟也不动弹。<br /><br />5、一七旬老翁与一年轻小姐****兴奋过度脱精而亡。其家人不服将小姐告上法庭。法官请法医验尸查明原因。法医验尸后下一结论：舒服死了！<br /><br />6、俩屎壳螂讨论福利彩票，甲说：我要中了大奖就把方圆50里的厕所都买下来，每天吃个够！乙说：你丫太俗了！我要是中了大奖就包一活人，每天吃新鲜的！<br /><br />7、洞房花烛夜的早晨，新郎一觉醒来，发现新娘泪流满面。惊讶问：心肝，为啥哭？新娘哭到：以后的日子怎么过？你那玩意儿用了一夜已经缩小到不成样子了！以后咋办呢！<br /><br />8、一老头乘公交去高潮村办事。途中问女服务员：高潮到了没？女服务员：还没呢。一会儿他又问：高潮到了没？服务员说：糟老头急什么，高潮到了我会叫的！<br /><br />9、老婆打麻将至凌晨回家，为了不扰醒丈夫，她先在客厅里脱光了衣服再进卧室。恰遇丈夫醒来，见了大怒到：太过份了！你竟输的精光？<br /><br />10、一对夫妻来到一口许愿井旁，丈夫弯腰，许个愿还往井里仍个硬币。妻子也想许愿但她弯腰时不小心翻入井里。丈夫惊呆了，然后又笑着对自己说真他*的灵啊！<br /><br />11、一艾滋病患者在临终前写了一副对联：上联是：为***生，为***死，为***奋斗一辈子；下联为：吃***亏，上***当，最终死在***上。横联：倒***霉。<br /><br />12、一小姐吃饭时点了道爆炒鞭花，夹菜时不慎掉到两腿之间，小姐大惊：这玩意真厉害！煮熟了剁碎了，它竟还认识路！<br /><br />13、一男青年在公交车上看到一美女的衣领开得很低，春光外泄，戏言道‘真是桃花盛开的地方啊’，美女听后，撩起裙子说：‘还有生你养你的地方’！<br /><br />14、儿子每晚要和妈睡。妈说：你长大娶了媳妇也和妈睡呀？儿答：嗯。妈说：那你媳妇咋办？儿说：让她跟爸爸睡。爸听后激动地说：这孩子从小就懂事！<br /><br />15、一对男女正在****，女的忽然跳下床，跑进厨房从米缸里抓了一把米，回来撒到男的身上，气哼哼地说：少在这里丢人现眼，回去去把小鸡喂大再来吧！<br /><br />16、公鸡出差一个月，回来后听说鹌鹑没事老来，公鸡怀疑。过两天母鸡生了个鹌鹑蛋，公鸡大怒，母鸡慌忙解释：*，早产啦！<br /><br />17、村妇报案说：丢人那！俺昨晚被强*了。pol.ice问他那人长啥样？那俺可没看清楚，不过肯定是个新手，因为他半天找不着地方，最后还是俺给他扶进去的。<br /><br />18、狐狸爱上了兔子，约？去喝啤酒，兔子醉了，狐狸趁机把兔子给强*了，过了几天狐狸又叫兔子去喝酒，兔子说：‘哎！不去了！不去了！，喝完啤酒屁股疼’<br /><br />19、少女夜半归家，遭七暴徒，危险时一大妈挺身而出，救走少女自遭轮*，电台采访，大妈言：其实当时啥也没想，只想这点好事可不能全便宜了那小骚娘们儿！<br /><br />20、屠夫嫖*被抓罚4000元并开收据。一日屠夫妻发现此收据，只识4000元不识‘嫖*’二字，问屠夫：何事罚4000元？屠夫答到：罚我肉中注水！<br /><br />21、一日一醉汉酒后打车回家，伸手拦了一辆110巡警车，并且嚷嚷道：就算你是一百一公里，也没必要写那么大吗！！！<br /><br />22、某君酒醉，误入女厕呕吐。恰逢一女正在小解，某君怒曰：‘说了不喝，怎么还倒酒？’女闻声急停，不料却憋出个屁来，君闻声大怒：‘谁他妈又开一瓶！’<br /><br />23、两个侏儒去鬼混，一个很快完事听隔壁整夜‘一二三、嘿，一二三、嘿…’。次日甲对乙说：‘你丫身体真棒！’乙：‘老子忙了一夜都没跳上床！’<br /><br />24、歹徒闯入民宅强*妇女遭到誓死反抗，丈夫下地回来见老婆被歹徒压住，抡起铁铲怒拍，就听老婆骂道：“该死的，反抗了半天，被你一铲子给拍进去了。<br /><br />25、一小孩在河边发现一女尸，于是报警说：河边一女人被打死，胸前两个大包，两腿间被砍了一刀出血很多，估计死亡时间过长，被砍处已经开始长毛了<br /><br />26、一名汽车司机经常被交警罚，非常恨交警。他妻子劝他说：以后咱生个孩子起名叫交警。你生气的时候你就打他。如果还不解恨你就操交警他妈！<br /><br />27、一带孙子洗澡裸体相见。孙子望着问：为什么上面的头发百了，下面却是黑的？答：上面遇到的都是伤脑筋的事，而下面遇到的都是高兴事啊！<br /><br />28、司机送领导参加文艺晚会，领导进了会场，司机被保安拦住，司机说：我跟领导是一个系统的，保安说：***跟蛋也是一个系统的，***进去了，蛋能进去吗？<br /><br />29、幼儿园女教师领学生游泳，不慎露出一根阴毛，一学生问：老师，那是什么啊？女教师一狠心将其拔掉，说：线头。<br /><br />30、有一日本女人在桑拿洗澡，想找中国猛男为其搓澡，猛男搓着搓着突然起性，将其阳物插入其羞处，日本女人大怒：你的什么的干活？猛男曰：里面的搓搓！<br /><br />31、妻妹姐夫哥，一起把河过，姐夫背妻妹，妻妹向下摸，问是啥东西？答曰坏家伙。姐夫反问她，你那是啥货？妻妹半含羞，这是派出所，专逮坏家伙！<br /><br />32、有一个小女孩头长的像板儿砖，一天问妈妈：我的头像板儿砖吗？他妈不知道怎么说，就说你去井里照照吧，她刚到井边，就听井底有人喊：孙子，你丫仍一试试！<br /><br />33、晚上，傻子逛公园见情侣****，爱看。次晨，见一男做俯卧撑，便细看，男人大怒：傻B你看什么！傻子一笑：我傻B？你才傻B那，底下人都走了，还干呢？<br /><br />34、某男50岁娶妻，妻年轻貌美次日清晨，邻居看见新郎披头散发，扶着墙根艰难地从屋里边走边说：骗子！婚前她跟我说有三十年的积蓄，我还以为是钱呢！<br /><br />35、一个秀才看到路边有一群村姑在种地，即兴做诗一首：春天里发春芽，春妮在地里把菜挖，早知耗？朝下，种它一地大？巴。<br /><br />36、小弟弟提出辞职的理由：1大体力劳动2在最深处工作3必须把脑袋伸进去4没节假日5工作环境潮湿黑暗6戴塑料面具呼吸困难7总是被迫干到吐为止。<br /><br />37、新婚第二天新娘就嚷着要离婚，原因是丈夫有严重的职业病！朋友都劝她‘男人都是很看重事业的！’不料新娘骂道：‘什么屁事业，他是挤奶工！’<br /><br />38、某人招*忘买套，用香肠的肠衣代替，后肠衣遗漏在****。次日*又接客，肠衣被带出，*女忙道：是我的处女膜。嫖客大怒：去你妈个逼的！处女膜还有生产日期？<br /><br />39、妻子患了感冒开始吃药，其体内的细菌召开紧急会议，讨论要赶紧出逃方案，免得被消灭，会议最后决定：搭乘当晚九点半的潜艇出去！<br /><br />40、一架飞机飞过一个精神病院。突然，驾驶员哈哈大笑起来，空中小姐好奇地问“你为什么笑得那么开心呀？”驾驶员：“要是他们知道我逃出来的话，一定会被气疯的！”<br /><br />41、母女二人参观女儿男朋友的画展。母亲发现其中一幅裸体人像酷似自己的女儿，便问道：“你没有光着身子给他画吧？”“啊，没有，”女儿答道，“他是凭记忆画的。”<br /><br />42、老师：“如何分辨章鱼的手和脚？”学生：“放个屁给它闻，会捂住鼻子的就是手，其他的就是脚。<br /><br />43、沙漠里一个快渴死的男人拣到一个神灯灯神将满足男人两个愿望男人想了想说，天天能喝到水，天天能看到女人的屁股接着就听到轰然一声巨响男人变成了马桶！<br /><br />44、四女孩在说来世做什么。甲说要做花人人都吻我：乙说要做麻将个个都摸我：丙说要做雪糕人人都舔我：丁说要做救护车个个都从后面上我，我还可以哇啦哇啦叫！<br /><br />45、某人养好斗的鹦鹉把它关在笼里，第一天放入麻雀被鹦鹉打死。鹦鹉说太小，后放入鹰，鹰也死。鹦鹉毛没了！它却说：妈的！丫还挺厉害不光膀子还真打不过它。<br /><br />46、
一艘船失事后，1名女乘客和10名男乘客漂到了一个荒岛上~~~~~一个月后，那个女的自杀了，因为她觉得这一个月发生的事情实在太恶心了~~~~~一个
月后，他们决定把她埋了，因为他们觉得这一个月发生的事情实在太恶心了~~~~~一个月后，他们决定把她挖出来，因为他们觉得这一个月发生的事情实在太恶
心了~~~~~一个月后，上帝把那个女的复活了，因为他觉得这几个月发生的事情实在太恶心了~~~~~<br /><br />47、有两口子吵架，男的说：我吵不赢你！你上面一张嘴，下面一张嘴！女的说：我更吵不赢你！你上面一张嘴，下面一个话筒，还带两个音响！……<br /><br />48、在酒店吃饭，我席间内急，服务员热情地说；我们酒店没有卫生间，你可以去对面公厕，我们和他们有约定，到那你就说你是’吃饭的’！<br /><br />49、小女孩总是向小男孩炫耀自己的新玩具。小男孩没办法，只好脱掉裤子说：这个你永远没有！女孩也脱掉裤子说：我妈说只要有这个，你那玩意儿要多少有多少！<br /><br />50、某商店养只鹞鹇，吊在门口，顾客进门就说‘欢迎光临’，一少女不信来回走了六次，鹞鹇跟着说六次，到了第七次，鹞鹇大怒说‘老板，有人玩你的鸟！’<br /><br />51、文革串联时期，火车异常拥挤，徐某趁停车将屁股伸出车窗外大便。车将启动时，列车员做最后巡视时大喊：‘叼雪茄的胖子，快把头缩回去！’‘！’<br /><br />52、一只大象问骆驼：‘你的咪咪怎么长在背上？’骆驼说：‘死远点，我不和***长在脸上的东西讲话！’<br /><br />53、一天瘸子和瞎子同骑一车外出。瞎子骑，瘸子看路，突然瘸子发现前方有一深沟急呼：沟，沟，沟！瞎子回唱到：奥勒奥类奥勒！二人一起掉入沟中！<br /><br />54、某地搞计划生育，有一位老太太为了不让儿媳妇上避孕环，就代替儿媳妇上，替到第四儿媳时大夫说：老太太你都上过了，再上就成奥迪了。<br /><br />55、新婚夫妇蜜月旅行到峨嵋山。妻被一群猴俘走。一个月后被救回。临产时夫在产房外见大夫出来忙问：男孩女孩？大夫：‘没看清，一出来就上树了。’<br /><br />56、山有母熊，猎人欲捕之。初战，猎人败，被熊*。羞愤交加！休数日。再战。又败！再被*！养伤毕，再往。熊见之，狂笑：‘你XXXX是来打猎还是M Y的？ 
<img src ="http://www.blogjava.net/tingfeng/aggbug/310047.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2010-01-19 11:21 <a href="http://www.blogjava.net/tingfeng/articles/310047.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求取数列的排列。利用递归</title><link>http://www.blogjava.net/tingfeng/articles/305137.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Tue, 08 Dec 2009 04:16:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/305137.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/305137.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/305137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/305137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/305137.html</trackback:ping><description><![CDATA[
		<pre>
				<span style="color: rgb(0, 0, 255);"> public class Order2 {<br />	static int num=1;<br /><br />	private boolean isIn(int a[],int start,int num){<br />		for(int i=0;i&lt;start;i++){<br />			if(a[i]==num)<br />				return true;<br />		}<br />		return false;<br />	}<br /><br />	public void orderNumber(int[] a, int start, int deep, int length, int k) {<br />		int passNum[]=new int[length];<br />		int passLength=0;<br />		for (int i = start; i &lt; length; i++) {<br />			if(isIn(passNum,passLength,a[i]))<br />				continue;<br /><br />			passNum[passLength]=new Integer(a[i]).intValue();<br />			passLength++;<br /><br />			int t = a[start];<br />			a[start] = a[i];<br />			a[i] = t;<br /><br />			if (deep == 1) {<br />				System.out.print(num+++" ");<br />				for (int j = 0; j &lt; k; j++)<br />					System.out.print(a[j]);<br />				System.out.println();<br />			} else<br />				orderNumber(a, start + 1, deep - 1, length, k);<br /><br />			t = a[start];<br />			a[start] = a[i];<br />			a[i] = t;	<br />		}<br /><br />	}<br /><br />	public static void main(String arg[]){<br />		int a[]={1,2,2,4,5};<br />		int start=0;<br />		int deep=3;<br />		int length=5;<br />		new Order2().orderNumber(a, start, deep, length,deep);<br />	}<br />}<br /></span>
				<span style="color: rgb(0, 0, 0);">
						<br />
				</span>
		</pre>
<img src ="http://www.blogjava.net/tingfeng/aggbug/305137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2009-12-08 12:16 <a href="http://www.blogjava.net/tingfeng/articles/305137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】JAVA时间类型操作</title><link>http://www.blogjava.net/tingfeng/articles/301776.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Tue, 10 Nov 2009 02:23:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/301776.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/301776.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/301776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/301776.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/301776.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->				/**										 日期类 * @date   2003-12-04 * 				@version				 1.0 				*/												...&nbsp;&nbsp;<a href='http://www.blogjava.net/tingfeng/articles/301776.html'>阅读全文</a><img src ="http://www.blogjava.net/tingfeng/aggbug/301776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2009-11-10 10:23 <a href="http://www.blogjava.net/tingfeng/articles/301776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>百度面试题目--蚂蚁爬杆</title><link>http://www.blogjava.net/tingfeng/articles/297897.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Mon, 12 Oct 2009 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/297897.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/297897.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/297897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/297897.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/297897.html</trackback:ping><description><![CDATA[
		<br />有一根27厘米的细木杆，在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细，不能同时通过一只蚂蚁。开始时，蚂蚁的
头朝左还是朝右是任意的，它们只会朝前走或调头，但不会后退。当任意两只蚂蚁碰头时，两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距
离。编写程序，求所有蚂蚁都离开木杆的最小时间和最大时间。<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> AntGame {<br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> maxTime</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">,minTime</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">99999999</span><span style="color: rgb(0, 0, 0);">;<br />    Ant[] ant</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ant[</span><span style="color: rgb(0, 0, 0);">5</span><span style="color: rgb(0, 0, 0);">];<br />    Ant head</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ant(</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">);<br />    <br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> initDate(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> s){<br />        ant[</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">]</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ant(</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">,s</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />        ant[</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">]</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ant(</span><span style="color: rgb(0, 0, 0);">7</span><span style="color: rgb(0, 0, 0);">,s</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />        ant[</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">]</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ant(</span><span style="color: rgb(0, 0, 0);">11</span><span style="color: rgb(0, 0, 0);">,s</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />        ant[</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">]</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ant(</span><span style="color: rgb(0, 0, 0);">17</span><span style="color: rgb(0, 0, 0);">,s</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">8</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />        ant[</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">]</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Ant(</span><span style="color: rgb(0, 0, 0);">23</span><span style="color: rgb(0, 0, 0);">,s</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">16</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />        <br />        head.setNext(ant[</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">]);<br />        </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> i</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">){<br />            ant[i].setNext(ant[i</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">]);<br />        }<br />        ant[</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">].setNext(</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">);<br />    }<br />    <br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> findResult(){<br />        Ant checkAnt;<br />        </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> time;<br />        </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> i</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">32</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">){<br />            initDate(i);<br />            display();<br />            time</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />            </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(head.getNext()</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">){<br />                <br />                checkAnt</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">head.getNext();                <br />                </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(checkAnt</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">){<br />                    checkAnt.walk();<br />                    checkAnt</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">checkAnt.getNext();<br />                }<br />                checkAnt</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">head;<br />                </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(checkAnt</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">checkAnt.getNext()</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">){<br />                    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(checkAnt.getNext().posion</span><span style="color: rgb(0, 0, 0);">&lt;=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">||</span><span style="color: rgb(0, 0, 0);">checkAnt.getNext().posion</span><span style="color: rgb(0, 0, 0);">&gt;=</span><span style="color: rgb(0, 0, 0);">27</span><span style="color: rgb(0, 0, 0);">){<br />                        checkAnt.setNext(checkAnt.getNext().getNext());<br />                        checkAnt</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">checkAnt.getNext();<br />                    }<br />                    </span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(checkAnt.getPosion()</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">checkAnt.getNext().getPosion()){<br />                        checkAnt.back();<br />                        checkAnt.getNext().back();<br />                        checkAnt</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">checkAnt.getNext().getNext();<br />                    }</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">    <br />                        checkAnt</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">checkAnt.getNext();<br />                }<br />                time</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">;<br />            }<br />            System.out.println(time);<br />            </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(time</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">maxTime)<br />                maxTime</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">time;<br />            </span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(time</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">minTime)<br />                minTime</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">time;<br />        }<br />        System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">minTime:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">minTime</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">\tmaxTime:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">maxTime);<br />    }<br />    <br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> display(){<br />        Ant checkAnt</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">head.getNext();                <br />        </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(checkAnt</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">){<br />            System.out.print(checkAnt.getPosion()</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">checkAnt.getDirection()</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">\t</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />            checkAnt</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">checkAnt.getNext();<br />        }<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">System.out.println();</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    }<br />    <br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> main(String arg[]){<br />        AntGame m</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> AntGame();<br />        m.findResult();<br />    }<br />    <br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Ant{<br />        </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> posion;<br />        </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> direction;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">1、-1分别代表正反方向</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> Ant next;<br />        </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> step</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Ant(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> posion,</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> direction){<br />            </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.posion</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">posion;<br />            </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.direction</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">direction;<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Ant getNext() {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> next;<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> setNext(Ant next) {<br />            </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.next </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> next;<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> getPosion() {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> posion;<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> getDirection() {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> direction;<br />        }        <br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> walk(){<br />            posion</span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);">direction</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">step;<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> back(){<br />            direction</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">(direction</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">;<br />            direction</span><span style="color: rgb(0, 0, 0);">--</span><span style="color: rgb(0, 0, 0);">;<br />                       </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">运算后1、-1互换</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        }<br />    }<br />}<br /></span></div><br /><img src ="http://www.blogjava.net/tingfeng/aggbug/297897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2009-10-12 15:19 <a href="http://www.blogjava.net/tingfeng/articles/297897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】Netbeans Platform: Lookup! Lookup!</title><link>http://www.blogjava.net/tingfeng/articles/295467.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Thu, 17 Sep 2009 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/295467.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/295467.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/295467.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/295467.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/295467.html</trackback:ping><description><![CDATA[<span id="ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry">
				<div id="msgcns!819cbc613de169ef!141" class="bvMsg">
						<p>Netbeans Platform的Lookup类给我们带来了什么呢？注入依赖和解耦！Lookup的基本用法常常是：</p>
						<p>Foo foo = someLookup.lookup(Foo.class)</p>
						<p>使用Lookup来查找一个Foo类的实例。你可以将Lookup想成是一个Map,键是类，值是实例。</p>
						<p>Netbeans中Lookup用途有：</p>
						<p>1. 表现一个对象的能力。IS-A关系转变为HAS-A关系。</p>
						<p>想
想传统的一种解耦方式：将其他模块创建的对象cast到特定的类型。Netbeans,不这么做，Netbeans做法是让其他模块创建的对象实现
Lookup.Provider接口（这个接口只有一个方法：public Lookup
getLookup()）,然后通过这个Lookup获得你需要协同工作的对象。然后你的代码询问这个对象是否拥有特定接口的实例：</p>
						<p>Your code&nbsp; &lt;--&nbsp;&nbsp; interact with --&gt;&nbsp;Some object -- implements --&gt; Lookup.Provider</p>
						<p>&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;&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; |__ has a Lookup Object -- maintain </p>
						<p>&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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |__ Object 1</p>
						<p>&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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|__ Object 2</p>
						<p>&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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|__ Object 3 ...</p>
						<p>这
样，通过Lookup, Some object 将 IS-A 关系（Some
object实现Object1接口，Object2接口，Object3接口）转化为HAS-A关系（Some
object的lookup对象拥有Object1, Object2, Object3）.</p>
						<p>这种转化具有重要的意义！方便！快捷！动态
（运行时无法改变实现的接口和类型）！弹性（运行时一个对象的能力是可能变化的，但是类型是不能变化的）！例如如果你想保存一个对象，你不必问其是否实现
Saveable接口，你只需要问其是否拥有一个SaveCookie实例（SaveCookie有一个save方法）。</p>
						<p>2. 依赖注射和解耦</p>
						<p>一个模块能够定义多个接口让其他模块实现这些接口，这个模块可以使用Lookup.getDefault()方法获得全局Lookup,然后根据全局Lookup查找其接口的所有实现。</p>
						<p>3. 动态服务发现</p>
						<p>模块能够非常简单的将代表全局服务或伪单例的对象通过默认的Lookup进行注射。</p>
						<p>单
例模式的的目的是让一个对象只拥有一个实例。实现这种模式又很多方法，例如最简单的是创建一个工厂方法，然后将构造器定义为私有的，然后维护一个实例，对
所有的调用（工厂方法）都返回这个实例。单例模式在Netbeans中也有广泛的应用。通常全局服务没有必要有多个实例，例如在整个应用程序的主窗口中我
们只需要一个状态显式栏实例，来显式状态。例如Netbeans的Windows系统API,你不用直接使用它，这个模块
org.netbeans.core.windows将StatusDisplayer实现注射进来，放在默认的Lookup中，你仅仅使用
StatusDisplayer.getDefault().setStatusText("something").就可以设置状态信息了。</p>
						<p>Lookup.Result 和 Lookup.Template</p>
						<p>&nbsp;</p>
						<p>什么样的对象需要拥有自己的Lookup呢？</p>
						<p>在Netbeans中的一些基本API类中又很多都有getLookup()方法，他们都实现了Lookup.Provider接口。Netbeans中有三个著名的例子：</p>
						<p>1.
Project. Project API .
Project实际就是一个将一个目录和一个Lookup结合在一起，再加点东西的一个对象。Project API
定义了能在一个Project实例的Lookup中出现的（可选的）类。不同的模块实现了Project,提供自己的实现。其他API定义一些其他的类。
例如Java Project
API定义了一个ClassPathProvider的接口。这个接口能在Java源代码Project的Lookup中被找到，而其他普通的
Project没必要有这个接口。整个Project类定义如下：</p>
						<p>public interface Project extends Lookup.Provider {</p>
						<p>// 维护一个文件对象，代表项目目录<br />FileObject getProjectDirectory();</p>
						<p>// 维护一个Lookup对象<br />Lookup getLookup();<br />}</p>
						<p>可以从Project的Lookup中请求多个接口。例如ProjectInformation对象能够提供Project名称等基本信息。</p>
						<p>2. TopComponent . 顶层组件是Netbeans的窗口系统管理的一个GUI面板。继承于TopComponent的类可以通过TopComponent.getLookup()方法来操作面板中的选择等事务。</p>
						<p>3. Node. 节点就是通常说得树－节点类型的对象，代表底层的数据模型。例如项目和文件窗口中的文件树就是节点树。org.openide.nodes.Node就有getLookup()方法。</p>
						<p>说了Netbeans中著名的三种具有Lookup对象的类，到底什么样的对象需要Lookup对象呢？？</p>
						<p>答案是，需要暴露某些能力的对象。这些对象可以通过Lookup对象向外界表明其具备某些能力，从而让其他代码能够使用这些对象的能力。举个例子，如果你想保存一个文件对象，那么这个文件对象肯定有保存的能力。传统方式怎么做呢：</p>
						<p>public void actionPerformed (ActionEvent e) {<br />Object o = something.getSelection();</p>
						<p>// 你会检查其是否实现Saveable接口<br />if (o instanceof Saveable &amp;&amp; ((Saveable) o).canSave()) {<br />((Saveable) o).save();<br />}<br />}</p>
						<p>可
惜的是这种方法太不强大了。Java对象无法轻易更改他们的类型。因为情况总是在变化的。Java文件包括源文件和编译文件，有些事情你无法在只有源文件
没有编译文件的情况下做，例如执行。并不是所有Java源文件都有对应的编译文件的。因此Lookup的出现能够很好的解决这种问题。Java文件的
Lookup内容是可以随时变化。当Java源文件被编译后，可以向Java文件的Lookup内容添加一个编译文件对象，如果Java文件被编译了，那
么Lookup内容中就保存一个编译文件对象，如果编译文件被删除了，这个编译对象也从Lookup内容中删除了。</p>
						<p>public void actionPerformed (ActionEvent e) {<br />Lookup lkp = Utilities.actionsGlobalContext();<br />SaveCookie save = lkp.lookup (SaveCookie.class);<br />if (save != null) {<br />save.save();<br />}<br />}  </p>
						<p>事
实上，Netbeans中一个正在被编辑的文件的保存过程，就是代表这个文件的节点Node的Lookup中出现了一个SaveCookie对象。这个代
码并不需要知道SaveCookie.save()方法的具体细节，只需要知道SaveCookie对象在Lookup中，就可以保存。 </p>
						<p>Lookup是一种通讯机制  </p>
						<p>上
面说得Project就是一个例子，Netbeans中有一个概念叫服务提供者接口(Service Provider Interface,
SPI&nbsp;). 不同的模块通过在默认的Lookup中安装ProjectFactory实例，来插入不同的项目类型project
type.你可以在Netbeans的项目向导中发现你可以创建不同类型的项目。Netbeans包含多个项目接口的实现。 </p>
						<p>Lookup和代理  </p>
						<p>ProxyLookup允许将两个Lookup融合。  </p>
						<p>Lookup和选择</p>
						<p>那我们如何在程序中使用Lookup呢？</p>
						<p>基本上说，我们无需自己编写Lookup(当然如果需要的话，你可以编写)。</p>
						<p>NetBeans 的 Lookup 可以說是无处不在，它也是 NetBeans 中最基本的模块。在执行的時候，NetBeans&nbsp;将Lookup分为系统服务池的Lookup和具有焦点窗口的对象池的Lookup。我们可以从以下地方获得Lookup：<a href="http://www.netbeans.org/download/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.html">TopComponent</a> 、<a href="http://www.netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/Node.html">Node</a> 、<a href="http://www.netbeans.org/download/dev/javadoc/org-openide-util/org/openide/util/Utilities.html">Utilities</a>.<code><strong><a href="http://www.netbeans.org/download/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#actionsGlobalContext%28%29">actionsGlobalContext</a></strong>()</code>、和 <a href="http://www.netbeans.org/download/dev/javadoc/org-openide-util/org/openide/util/Lookup.html">Lookup</a>s四个地方。 </p>
						<p>我
们通过Utilities.actionsGlobalContext()来获得对象池的Lookup,
这里Netbeans已经帮我们整合过Lookup对象了.Utilities.actionsGlobalContext()将返回一个Lookup对
象，这个对象是活动的（具有焦点）的顶层组件的Lookup的代理Lookup,如果顶层组件是Explorer视图的话，将代理被选择了的节点的
Lookup对象们。 </p>
						<p>我们通过Lookup.getDefault()方式获得系统服务池的Lookup. </p>
						<p>Netbeans平台为我们准备好了几种使用方式：</p>
						<p>1.
通过Lookups. 如果你需要包含固定数目对象的Lookup，你可以使用Lookups.fixed(Object...
objectsToLookup) (注意：... 代表可变参数数量)，也可以使用Lookups.singleton(Object
objectToLookup)返回一个只包含一个对象的Lookup.</p>
						<p>2.
AbstractLookup和InstanceContent.
如果你希望你的Lookup可以动态的包含对象（数目可变），那么你可以使用AbstractLookup和InstanceContent相结合的方
式。注意AbstractLookup并不是抽象类。具体的用法这里有个很好的例子，<a href="http://fox.jenming.info/?p=22">Fox的Lookup讲解</a>：</p>
						<p>在
这个例子中，有一个业务对象FoxObject,
有两个顶层组件：Consumer顶层组件和Producer顶层组件。Producer顶层组件中包含两个状态按钮
（ToggleButton）:FoxButton和DonButton。Consumer顶层组件有一个List表单。</p>
						<p>效果是：如果你
按下Producer顶层组件窗口中的其中一个Button，就会创建一个FoxObject对象，其名字根据按钮的名字命名，例如按下
DonButton将创建一个名字为Don的FoxObject.
如果程序的焦点在Producer顶层组件上（蓝色背景意味焦点在其上，灰色背景意味焦点不在其上）的话，Consumer顶层组件的List表单将出现
这个名字为Don的FoxObject,
当你再次按下DonButton时，按钮的状态改变，名字为Don的FoxObject被删除，List表单中相应的对象也消失了。如果你将程序焦点换到
Consumer顶层组件的时候，List表单中的所有对象都消失了，重新将焦点换到Producer顶层组件上时，List表单中的对象重新出现了。</p>
						<p>这是怎么实现的呢？我们看一下：</p>
						<p>1. 我们在Producer顶层组件中维护一个InstanceContent对象，两个FoxObject对象。在Producer顶层组件构造的时候，我们初始化Lookup:</p>
						<p>private void initLookup(){</p>
						<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 创建InstanceContent,然后构建一个AbstractLookup,然后将这个Lookup和Producer顶层组件关联<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_InstancePool=new InstanceContent();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.associateLookup(new AbstractLookup(m_InstancePool));&nbsp;<br />&nbsp;&nbsp;&nbsp; }</p>
						<p>在ToggleButton状态变化方法中，我们根据Button的状态，决定InstanceContent的内容（名为Don的FoxObject对象的添加和删除）</p>
						<p>private void m_PutDonItemStateChanged(java.awt.event.ItemEvent evt) {&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(evt.getStateChange()==ItemEvent.SELECTED){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_Don==null){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_Don=FoxObject.createInstance("don", "Don, Chen");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_InstancePool.add(m_Don);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else if(evt.getStateChange()==ItemEvent.DESELECTED){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_Don!=null){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_InstancePool.remove(m_Don);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </p>
						<p>2. 我们让Consumer顶层组件实现LookupLisenter, 因为他要根据FoxObject对象的状态来显式List表单。他维护一个JList表单以及一个Lookup.Result结果。 </p>
						<p>final class ConsumerTopComponent extends TopComponent implements LookupListener {... </p>
						<p>当Consumer顶层组件被打开和关闭时： </p>
						<p>public void componentOpened() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clearList();</p>
						<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 初始化LookupQuery<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initLookupQuery();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FoxService oService=(FoxService) Lookup.getDefault().lookup(FoxService.class);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(oService !=null ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oService.saySomething();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void componentClosed() {</p>
						<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 关闭LookupQuery<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uninitLookupQuery();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clearList();<br />&nbsp;&nbsp;&nbsp; }</p>
						<p>我
们看一下，在Consumer顶层组件窗口被打开时，我们根据FoxObject类制作一个模版，然后通过
Utilities.actionsGlobalContext()查找到所有FoxObject的实例，以Lookup.Result方式展现。找到这
些FoxObject实例后，对代表他们的Lookup.Result添加监听器，就是Consumer顶层组件自己。然后更新结果列表。</p>
						<p>private void initLookupQuery(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lookup.Template oFoxTemplate=new Lookup.Template(FoxObject.class);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_LookupResult=Utilities.actionsGlobalContext().lookup(oFoxTemplate);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_LookupResult.addLookupListener(this);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; refreshResultList();<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; private void uninitLookupQuery(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_LookupResult!=null){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_LookupResult.removeLookupListener(this);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_LookupResult=null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; } </p>
						<p>实现Lookup监听器的方法: </p>
						<p>public void resultChanged(LookupEvent ev){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; refreshResultList();<br />&nbsp;&nbsp;&nbsp; } </p>
						<p>一旦Lookup变化了，resultChanged方法就被调用，执行refreshResultList方法。这个方法获得Lookup.Result中的所有实例，如果有实例的话，重新根据这些实例绘制Consumer顶层组件的List表单。</p>
						<p>private void refreshResultList(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Collection&lt;FoxObject&gt; cList=m_LookupResult.allInstances();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!cList.isEmpty()){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.m_FoxObjectList.setListData(new Vector&lt;FoxObject&gt;(cList));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.m_FoxObjectList.revalidate();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.m_FoxObjectList.repaint();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clearList();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; } </p>
						<p>整个演示就完成了。这里我们特别要注意几点： </p>
						<p>1. FoxObject是业务对象，它仅仅关注自己的业务和信息，例如名字，ID等，对其他的事情一概不知。 </p>
						<p>2. Producer顶层组件需要和一个Lookup关联，这个Lookup是AbstractLookup和InstanceContent共同完成的，以便Lookup内的对象数目可以动态改变（通过ToggleButton的状态）： </p>
						<p>ProducerTopComponent --&gt; AbstractLookup --&gt; InstanceContent&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt; FoxObject Class </p>
						<p>&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|__ Add/Remove --&gt; Fox FoxObject &lt;--&gt; Button1 </p>
						<p>&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |__ Add/Remove --&gt; Don FoxObject &lt;--&gt;
Button2 </p>
						<p>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | </p>
						<p>&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;&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; <font color="#ff0000">关键：Netbeans通过Utilities.actionsGlobalContext将</font></p>
						<p>&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;&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; <font color="#ff0000">Producer顶层组件和Consumer顶层组件解耦，相互通过Lookup沟通</font></p>
						<p>ConsumerTopComponent --&gt; Utilities.actionsGlobalContext().lookup(FoxObject.class) </p>
						<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|______&nbsp; 监听 --&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |__ Lookup.Result </p>
						<p>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; |______&nbsp; 更新 --&gt;&nbsp;&nbsp;&nbsp;&nbsp; JList (根据Lookup.Result的变化) </p>
						<p>3. 结构图 </p>
						<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;--------------&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;&nbsp;&nbsp;&nbsp; FoxObject&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---------------&gt; </p>
						<p>&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;&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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | </p>
						<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;-----&nbsp;&nbsp;&nbsp;Lookup (Utilitis, AbstractLookup, InstanceConent)&nbsp; ------&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | </p>
						<p>&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;&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;&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;&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;&nbsp;&nbsp;&nbsp;
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | </p>
						<p>&nbsp;&nbsp;&nbsp;&nbsp; ConsumerTopComponent&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;&nbsp;&nbsp;&nbsp;XXX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProducerTopComponent</p>
						<p>
								<br />
						</p>
						<p>转自http://alarnan.spaces.live.com/blog/cns!819cbc613de169ef!141.entry<br /></p>
				</div>
		</span><img src ="http://www.blogjava.net/tingfeng/aggbug/295467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2009-09-17 16:36 <a href="http://www.blogjava.net/tingfeng/articles/295467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设置字体的一篇文章</title><link>http://www.blogjava.net/tingfeng/articles/269230.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Wed, 06 May 2009 06:01:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/269230.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/269230.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/269230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/269230.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/269230.html</trackback:ping><description><![CDATA[
		<p style="font-size: 12pt;">
				<span style="color: rgb(0, 128, 0);">import java.awt.BorderLayout;<br />import java.awt.Color;<br />import java.awt.event.ActionEvent;<br />import java.awt.event.ActionListener;</span>
		</p>
		<p style="color: rgb(0, 128, 0);">import javax.swing.JButton;<br />import javax.swing.JEditorPane;<br />import javax.swing.JPanel;<br />import javax.swing.JScrollPane;<br />import javax.swing.JTextPane;<br />import javax.swing.UIManager;<br />import javax.swing.WindowConstants;<br />import javax.swing.text.AttributeSet;<br />import javax.swing.text.DefaultStyledDocument;<br />import javax.swing.text.Document;<br />import javax.swing.text.EditorKit;<br />import javax.swing.text.MutableAttributeSet;<br />import javax.swing.text.SimpleAttributeSet;<br />import javax.swing.text.StyleConstants;<br />import javax.swing.text.StyledDocument;<br />import javax.swing.text.StyledEditorKit;</p>
		<p style="color: rgb(0, 128, 0);">public class NewJFrame extends javax.swing.JFrame implements ActionListener {<br /> private JPanel jp1;</p>
		<p style="color: rgb(0, 128, 0);"> private JButton color;</p>
		<p style="color: rgb(0, 128, 0);"> private JTextPane jep;</p>
		<p style="color: rgb(0, 128, 0);"> private JScrollPane jsp;</p>
		<p style="color: rgb(0, 128, 0);"> private JButton font;</p>
		<p style="color: rgb(0, 128, 0);"> /**<br />  * Auto-generated main method to display this JFrame<br />  */<br /> public static void main(String[] args) {<br />  NewJFrame inst = new NewJFrame();<br />  inst.setVisible(true);<br /> }</p>
		<p style="color: rgb(0, 128, 0);"> public NewJFrame() {<br />  super();<br />  initGUI();<br /> }</p>
		<p style="color: rgb(0, 128, 0);"> private void initGUI() {<br />  try {<br />   BorderLayout thisLayout = new BorderLayout();<br />   getContentPane().setLayout(thisLayout);<br />   setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);<br />   {<br />    jp1 = new JPanel();<br />    getContentPane().add(jp1, BorderLayout.NORTH);<br />    {<br />     font = new JButton();<br />     font.addActionListener(this);<br />     jp1.add(font);<br />     font.setText("font");<br />    }<br />    {<br />     color = new JButton();<br />     jp1.add(color);<br />     color.addActionListener(this);<br />     color.setText("color");<br />    }<br />   }<br />   {<br />    jsp = new JScrollPane();<br />    getContentPane().add(jsp, BorderLayout.CENTER);<br />    {<br />     jep = new JTextPane();<br />     jsp.setViewportView(jep);<br />     jep.setDocument(new DefaultStyledDocument());<br />    }<br />   }<br />   pack();<br />   setSize(400, 300);<br />  } catch (Exception e) {<br />   e.printStackTrace();<br />  }<br /> }</p>
		<p style="color: rgb(0, 128, 0);"> public static void setFontSize(JEditorPane editor, int size) {<br />  if (editor != null) {<br />   if ((size &gt; 0) &amp;&amp; (size &lt; 512)) {<br />    MutableAttributeSet attr = new SimpleAttributeSet();<br />    StyleConstants.setFontSize(attr, size);<br />    setCharacterAttributes(editor, attr, false);<br />   } else {<br />    UIManager.getLookAndFeel().provideErrorFeedback(editor);<br />   }<br />  }<br /> }</p>
		<p style="color: rgb(0, 128, 0);"> public static void setForeground(JEditorPane editor, Color fg) {<br />  if (editor != null) {<br />   if (fg != null) {<br />    MutableAttributeSet attr = new SimpleAttributeSet();<br />    StyleConstants.setForeground(attr, fg);<br />    setCharacterAttributes(editor, attr, false);<br />   } else {<br />    UIManager.getLookAndFeel().provideErrorFeedback(editor);<br />   }<br />  }<br /> }</p>
		<p style="color: rgb(0, 128, 0);"> public static final void setCharacterAttributes(JEditorPane editor,<br />   AttributeSet attr, boolean replace) {<br />  int p0 = editor.getSelectionStart();<br />  int p1 = editor.getSelectionEnd();<br />  if (p0 != p1) {<br />   StyledDocument doc = getStyledDocument(editor);<br />   doc.setCharacterAttributes(p0, p1 - p0, attr, replace);<br />  }<br />  StyledEditorKit k = getStyledEditorKit(editor);<br />  MutableAttributeSet inputAttributes = k.getInputAttributes();<br />  if (replace) {<br />   inputAttributes.removeAttributes(inputAttributes);<br />  }<br />  inputAttributes.addAttributes(attr);<br /> }</p>
		<p style="color: rgb(0, 128, 0);"> protected static final StyledDocument getStyledDocument(JEditorPane e) {<br />  Document d = e.getDocument();<br />  if (d instanceof StyledDocument) {<br />   return (StyledDocument) d;<br />  }<br />  throw new IllegalArgumentException("document must be StyledDocument");<br /> }</p>
		<p style="color: rgb(0, 128, 0);"> protected static final StyledEditorKit getStyledEditorKit(JEditorPane e) {<br />  EditorKit k = e.getEditorKit();<br />  if (k instanceof StyledEditorKit) {<br />   return (StyledEditorKit) k;<br />  }<br />  throw new IllegalArgumentException("EditorKit must be StyledEditorKit");<br /> }</p>
		<p style="color: rgb(0, 128, 0);"> public void actionPerformed(ActionEvent e) {<br />  Object obj = e.getSource();<br />  if (obj == font) {<br />   JEditorPane editor = jep;<br />   setFontSize(editor, 20);<br />  }<br />  if (obj == color) {<br />   JEditorPane editor = jep;<br />   setForeground(editor, Color.red);<br />  }<br /> }</p>
		<p style="color: rgb(0, 128, 0);">}<br />其他操作如下：<br />1、对字体的操作 <br />MutableAttributeSet attr = new SimpleAttributeSet();<br />    StyleConstants.setFontFamily(attr, family);<br />    setCharacterAttributes(editor, attr, false); <br />family为字体<br />2、对字体大小的操作<br />MutableAttributeSet attr = new SimpleAttributeSet();<br />    StyleConstants.setFontSize(attr, size);<br />    setCharacterAttributes(editor, attr, false);<br />size为字号<br />3、是否是粗体的操作<br />StyledEditorKit kit = getStyledEditorKit(editor);<br />   MutableAttributeSet attr = kit.getInputAttributes();<br />   boolean bold = (StyleConstants.isBold(attr)) ? false : true;<br />   SimpleAttributeSet sas = new SimpleAttributeSet();<br />   StyleConstants.setBold(sas, bold);<br />   setCharacterAttributes(editor, sas, false);<br />4、是否是斜体的操作<br />StyledEditorKit kit = getStyledEditorKit(editor);<br />   MutableAttributeSet attr = kit.getInputAttributes();<br />   boolean italic = (StyleConstants.isItalic(attr)) ? false : true;<br />   SimpleAttributeSet sas = new SimpleAttributeSet();<br />   StyleConstants.setItalic(sas, italic);<br />   setCharacterAttributes(editor, sas, false);<br />5、是否有下划线的操作<br />StyledEditorKit kit = getStyledEditorKit(editor);<br />   MutableAttributeSet attr = kit.getInputAttributes();<br />   boolean underline = (StyleConstants.isUnderline(attr)) ? false<br />     : true;<br />   SimpleAttributeSet sas = new SimpleAttributeSet();<br />   StyleConstants.setUnderline(sas, underline);<br />   setCharacterAttributes(editor, sas, false);<br />6、左中右对齐的处理<br />MutableAttributeSet attr = new SimpleAttributeSet();<br />   StyleConstants.setAlignment(attr, a);<br />   setParagraphAttributes(editor, attr, false);<br />public static final void setParagraphAttributes(JEditorPane editor,<br />   AttributeSet attr, boolean replace) {<br />  int p0 = editor.getSelectionStart();<br />  int p1 = editor.getSelectionEnd();<br />  StyledDocument doc = getStyledDocument(editor);<br />  doc.setParagraphAttributes(p0, p1 - p0, attr, replace);<br /> }<br />a:0：左，1：中，2：右</p>
		<p style="font-size: 12pt;">
				<span style="color: rgb(0, 128, 0);">7、文本字体颜色的设置<br />MutableAttributeSet attr = new SimpleAttributeSet();<br />    StyleConstants.setForeground(attr, fg);<br />    setCharacterAttributes(editor, attr, false);<br />fg：为color<br />8、文本背景颜色的设置<br />MutableAttributeSet attr = new SimpleAttributeSet();<br />    StyleConstants.setBackground(attr, bg);<br />    setCharacterAttributes(editor, attr, false);</span>
		</p>
<img src ="http://www.blogjava.net/tingfeng/aggbug/269230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2009-05-06 14:01 <a href="http://www.blogjava.net/tingfeng/articles/269230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>兼容问题</title><link>http://www.blogjava.net/tingfeng/articles/267744.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Mon, 27 Apr 2009 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/267744.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/267744.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/267744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/267744.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/267744.html</trackback:ping><description><![CDATA[在图形界面设计时，尽量使用同一类组建，SWing或者别的，否则很可能布局出问题。<img src ="http://www.blogjava.net/tingfeng/aggbug/267744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2009-04-27 16:44 <a href="http://www.blogjava.net/tingfeng/articles/267744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ANT-build.xml文件详解</title><link>http://www.blogjava.net/tingfeng/articles/263699.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Fri, 03 Apr 2009 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/263699.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/263699.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/263699.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/263699.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/263699.html</trackback:ping><description><![CDATA[
		<br />
		<br />Ant的概念<br />可能有些读者并不连接什么是Ant以及入可使用它，但只要使用通过Linux系统得读者，应该知道<br /><br />make这个命令。当编译Linux内核及一些软件的源程序时，经常要用这个命令。Make命令其实就<br /><br />是一个项目管理工具，而Ant所实现功能与此类似。像make，gnumake和nmake这些编译工具都有<br /><br />一定的缺陷，但是Ant却克服了这些工具的缺陷。最初Ant开发者在开发跨平台的应用时，用样也<br /><br />是基于这些缺陷对Ant做了更好的设计。<br /><br />Ant 与 makefile<br />Makefile有一些不足之处，比如很多人都会碰到的烦人的Tab问题。最初的Ant开发者多次强调”<br /><br />只是我在Tab前面加了一个空格，所以我的命令就不能执行”。有一些工具在一定程度上解决了<br /><br />这个问题，但还是有很多其他的问题。Ant则与一般基于命令的工具有所不同，它是Java类的扩<br /><br />展。Ant运行需要的XML格式的文件不是Shell命令文件。它是由一个Project组成的，而一个<br /><br />Project又可分成可多target，target再细分又分成很多task，每一个task都是通过一个实现特<br /><br />定接口的java类来完成的。<br /><br />Ant的优点<br /><br />Ant是Apache软件基金会JAKARTA目录中的一个子项目，它有以下的优点。<br />跨平台性。Ant是存Java语言编写的，所示具有很好的跨平台性。<br />操作简单。Ant是由一个内置任务和可选任务组成的。Ant运行时需要一个XML文件(构建文件)。<br /><br />Ant通过调用target树，就可以执行各种task。每个task实现了特定接口对象。由于Ant构建文件<br /><br />时XML格式的文件，所以和容易维护和书写，而且结构很清晰。<br />Ant可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点，它很容易集成到一些开发环<br /><br />境中去。<br /><br />Ant 开发<br /><br />Ant的构建文件<br />当开始一个新的项目时，首先应该编写Ant构建文件。构建文件定义了构建过程，并被团队开发<br /><br />中每个人使用。Ant构建文件默认命名为build.xml，也可以取其他的名字。只不过在运行的时候<br /><br />把这个命名当作参数传给Ant。构建文件可以放在任何的位置。一般做法是放在项目顶层目录中<br /><br />，这样可以保持项目的简洁和清晰。下面是一个典型的项目层次结构。<br />(1) src存放文件。<br />(2) class存放编译后的文件。<br />(3) lib存放第三方JAR包。<br />(4) dist存放打包，发布以后的代码。<br />Ant构建文件是XML文件。每个构建文件定义一个唯一的项目(Project元素)。每个项目下可以定<br /><br />义很多目标(target元素)，这些目标之间可以有依赖关系。当执行这类目标时，需要执行他们所<br /><br />依赖的目标。<br />每个目标中可以定义多个任务，目标中还定义了所要执行的任务序列。Ant在构建目标时必须调<br /><br />用所定义的任务。任务定义了Ant实际执行的命令。Ant中的任务可以为3类。<br />（1） 核心任务。核心任务是Ant自带的任务。<br />（2） 可选任务。可选任务实来自第三方的任务，因此需要一个附加的JAR文件。<br />（3） 用户自定义的任务。用户自定义的任务实用户自己开发的任务。<br />1.&lt;project&gt;标签<br />  每个构建文件对应一个项目。&lt;project&gt;标签时构建文件的根标签。它可以有多个内在属性，<br /><br />就如代码中所示，其各个属性的含义分别如下。<br />(1) default表示默认的运行目标，这个属性是必须的。<br />(2) basedir表示项目的基准目录。<br />(3) name表示项目名。<br />(4) description表示项目的描述。<br />每个构建文件都对应于一个项目，但是大型项目经常包含大量的子项目，每一个子项目都可以有<br /><br />自己的构建文件。<br /><br />2.&lt;target&gt;标签<br />一个项目标签下可以有一个或多个target标签。一个target标签可以依赖其他的target标签。例<br /><br />如，有一个target用于编译程序，另一个target用于声称可执行文件。在生成可执行文件之前必<br /><br />须先编译该文件，因策可执行文件的target依赖于编译程序的target。Target的所有属性如下。<br />(1).name表示标明，这个属性是必须的。<br />(2).depends表示依赖的目标。<br />(3)if表示仅当属性设置时才执行。<br />(4)unless表示当属性没有设置时才执行。<br />(5)description表示项目的描述。<br />Ant的depends属性指定了target的执行顺序。Ant会依照depends属性中target出现顺序依次执行<br /><br />每个target。在执行之前，首先需要执行它所依赖的target。程序中的名为run的target的<br /><br />depends属性compile，而名为compile的target的depends属性是prepare，所以这几个target执<br /><br />行的顺序是prepare-&gt;compile-&gt;run。<br />一个target只能被执行一次，即使有多个target依赖于它。如果没有if或unless属性，target总<br /><br />会被执行。<br /><br />3.&lt;mkdir&gt;标签<br />该标签用于创建一个目录，它有一个属性dir用来指定所创建的目录名，其代码如下：<br />&lt;mkdir dir=”＄{class.root}”/&gt;<br />通过以上代码就创建了一个目录，这个目录已经被前面的property标签所指定。<br /><br />4&lt;jar&gt;标签<br />该标签用来生成一个JAR文件，其属性如下。<br />(1) destfile表示JAR文件名。<br />(2) basedir表示被归档的文件名。<br />(3) includes表示别归档的文件模式。<br />(4) exchudes表示被排除的文件模式。<br /><br />5．&lt;javac标签&gt;<br />该标签用于编译一个或一组java文件，其属性如下。<br />(1).srcdir表示源程序的目录。<br />(2).destdir表示class文件的输出目录。<br />(3).include表示被编译的文件的模式。<br />(4).excludes表示被排除的文件的模式。<br />(5).classpath表示所使用的类路径。<br />(6).debug表示包含的调试信息。<br />(7).optimize表示是否使用优化。<br />(8).verbose 表示提供详细的输出信息。<br />(9).fileonerror表示当碰到错误就自动停止。<br /><br />6．&lt;java&gt;标签<br />该标签用来执行编译生成的.class文件，其属性如下。<br />(1).classname 表示将执行的类名。<br />(2).jar表示包含该类的JAR文件名。<br />(3).classpath所表示用到的类路径。<br />(4).fork表示在一个新的虚拟机中运行该类。<br />(5).failonerror表示当出现错误时自动停止。<br />(6).output 表示输出文件。<br />(7).append表示追加或者覆盖默认文件。<br /><br />7.&lt;delete&gt;标签<br />该标签用于删除一个文件或一组文件，去属性如下。<br />(1)/file表示要删除的文件。<br />(2).dir表示要删除的目录。<br />(3).includeEmptyDirs 表示指定是否要删除空目录，默认值是删除。<br />(4).failonerror 表示指定当碰到错误是否停止，默认值是自动停止。<br />(5).verbose表示指定是否列出所删除的文件，默认值为不列出。<br /><br />8.&lt;copy&gt;标签<br />该标签用于文件或文件集的拷贝，其属性如下。<br />(1).file 表示源文件。<br />(2).tofile 表示目标文件。<br />(3).todir 表示目标目录。<br />(4).overwrite 表示指定是否覆盖目标文件，默认值是不覆盖。<br />(5).includeEmptyDirs 表示制定是否拷贝空目录，默认值为拷贝。<br />(6).failonerror 表示指定如目标没有发现是否自动停止，默认值是停止。<br />(7).verbose 表示制定是否显示详细信息，默认值不显示。<br /><br />Ant的数据类型<br />在构建文件中为了标识文件或文件组，经常需要使用数据类型。数据类型包含在<br /><br />org.apache.tool.ant.types包中。下面镜简单介绍构建文件中一些常用的数据类型。<br /><br />1. argument 类型<br /> 由Ant构建文件调用的程序，可以通过&lt;arg&gt;元素向其传递命令行参数，如apply,exec和java任<br /><br />务均可接受嵌套&lt;arg&gt;元素，可以为各自的过程调用指定参数。以下是&lt;arg&gt;的所有属性。<br />(1).values 是一个命令参数。如果参数种有空格，但又想将它作为单独一个值，则使用此属性<br /><br />。<br />(2).file表示一个参数的文件名。在构建文件中，此文件名相对于当前的工作目录。<br />(3).line表示用空格分隔的多个参数列表。<br />(4).path表示路径。<br /><br />2.ervironment 类型<br />  由Ant构建文件调用的外部命令或程序，&lt;env&gt;元素制定了哪些环境变量要传递给正在执行的系<br /><br />统命令，&lt;env&gt;元素可以接受以下属性。<br />(1).file表示环境变量值得文件名。此文件名要被转换位一个绝对路径。<br />(2).path表示环境变量的路径。Ant会将它转换为一个本地约定。<br />(3).value 表示环境变量的一个直接变量。<br />(4).key 表示环境变量名。<br />注意  file path 或 value只能取一个。<br /><br />3.filelist类型<br /> Filelist 是一个支持命名的文件列表的数据类型，包含在一个filelist类型中的文件不一定是<br /><br />存在的文件。以下是其所有的属性。<br />(1).dir是用于计算绝对文件名的目录。<br />(2).files 是用逗号分隔的文件名列表。<br />(3).refid 是对某处定义的一个&lt;filelist&gt;的引用。<br />注意  dir 和 files 都是必要的，除非指定了refid(这种情况下，dir和files都不允许使用)。<br /><br />4.fileset类型<br />Fileset 数据类型定义了一组文件，并通常表示为&lt;fileset&gt;元素。不过，许多ant任务构建成了<br /><br />隐式的fileset,这说明他们支持所有的fileset属性和嵌套元素。以下为fileset 的属性列表。<br />(1).dir表示fileset 的基目录。<br />(2).casesensitive的值如果为false，那么匹配文件名时，fileset不是区分大小写的，其默认<br /><br />值为true.<br />(3).defaultexcludes 用来确定是否使用默认的排除模式，默认为true。<br />(4).excludes 是用逗号分隔的需要派出的文件模式列表。<br />(5).excludesfile 表示每行包含一个排除模式的文件的文件名。<br />(6).includes 是用逗号分隔的，需要包含的文件模式列表。<br />(7).includesfile 表示每行包括一个包含模式的文件名。<br /><br />5.patternset 类型<br />Fileset 是对文件的分组，而patternset是对模式的分组，他们是紧密相关的概念。<br /><br />&lt;patternset&gt;支持4个属性：includes excludex includexfile 和 excludesfile,与fileset相<br /><br />同。Patternset 还允许以下嵌套元素：include,exclude,includefile 和 excludesfile.<br /><br />6.filterset 类型<br />Filterset定义了一组过滤器，这些过滤器将在文件移动或复制时完成文件的文本替换。<br />主要属性如下：<br />(1).begintoken 表示嵌套过滤器所搜索的记号，这是标识其开始的字符串。<br />(2).endtoken表示嵌套过滤器所搜索的记号这是标识其结束的字符串。<br />(3).id是过滤器的唯一标志符。<br />(4).refid是对构建文件中某处定义一个过滤器的引用。<br /><br />7.Path类型<br />Path元素用来表示一个类路径，不过它还可以用于表示其他的路径。在用作揖个属性时，路经中<br /><br />的各项用分号或冒号隔开。在构建的时候，此分隔符将代替当前平台中所有的路径分隔符，其拥<br /><br />有的属性如下。<br />(1).location 表示一个文件或目录。Ant在内部将此扩展为一个绝对路径。<br />(2).refid 是对当前构建文件中某处定义的一个path的引用。<br />(3).path表示一个文件或路径名列表。<br /><br />8.mapper类型<br />Mapper类型定义了一组输入文件和一组输出文件间的关系，其属性如下。<br />(1).classname 表示实现mapper类的类名。当内置mapper不满足要求时，用于创建定制mapper.<br />(2).classpath表示查找一个定制mapper时所用的类型路径。<br />(3).classpathref是对某处定义的一个类路径的引用。<br />(4).from属性的含义取决于所用的mapper.<br />(5).to属性的含义取决于所用的mapper.<br />(6).type属性的取值为identity，flatten glob merge  regexp  其中之一，它定义了要是用的<br />内置mapper的类型。<br /><br /><br />Ant 的运行<br />安装好Ant并且配置好路径之后，在命令行中切换到构建文件的目录，输入Ant命令就可以运行<br /><br />Ant.若没有指定任何参数，Ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为<br /><br />构建文件。如果使用了 –find 选项，Ant 就会在上级目录中找构建文件，直至到达文件系统得<br /><br />跟目录。如果构建文件的名字不是build.xml ，则Ant运行的时候就可以使用 –buildfile file<br /><br />,这里file 指定了要使用的构建文件的名称，示例如下：<br />Ant<br />如下说明了表示当前目录的构建文件为build.xml 运行 ant 执行默认的目标。<br /><br />Ant –buildfile  test.xml<br />使用当前目录下的test.xml 文件运行Ant ,执行默认的目标<br /><br /><img src ="http://www.blogjava.net/tingfeng/aggbug/263699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2009-04-03 11:20 <a href="http://www.blogjava.net/tingfeng/articles/263699.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>System.getProperty()参数大全</title><link>http://www.blogjava.net/tingfeng/articles/263698.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Fri, 03 Apr 2009 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/263698.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/263698.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/263698.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/263698.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/263698.html</trackback:ping><description><![CDATA[System.getProperty()参数大全<br />key               detail<br />----------------------------------------------------------------------------------<br />java.version                   Java Runtime Environment version<br />java.vendor                 Java Runtime Environment vendor<br />java.vendor.url                 Java vendor URL<br />java.home                     Java installation directory<br />java.vm.specification.version                    Java Virtual Machine specification version<br />java.vm.specification.vendor                     Java Virtual Machine specification vendor<br />java.vm.specification.name                  Java Virtual Machine specification name<br />java.vm.version                  Java Virtual Machine implementation version<br />java.vm.vendor                   Java Virtual Machine implementation vendor<br />java.vm.name                   Java Virtual Machine implementation name<br />java.specification.version                   Java Runtime Environment specification version<br />java.specification.vendor                 Java Runtime Environment specification vendor<br />java.specification.name              Java Runtime Environment specification name<br />java.class.version                           Java class format version number<br />java.class.path                       Java class path<br />java.library.path                          List of paths to search when loading libraries<br />java.io.tmpdir                      Default temp file path<br />java.compiler                   Name of JIT compiler to use<br />java.ext.dirs                   Path of extension directory or directories<br />os.name                        Operating system name<br />os.arch                        Operating system architecture<br />os.version                    Operating system version<br />file.separator                   File separator ("/" on UNIX)<br />path.separator                   Path separator (":" on UNIX)<br />line.separator                   Line separator ("\n" on UNIX)<br />user.name                    User's account name<br />user.home                    User's home directory<br />user.dir                       User's current working directory  <br />file.encoding        系统属性<br />---------------------------------------------------------------------------------<br />java.version              Java 运行时环境版本<br />java.vendor           Java 运行时环境供应商<br />java.vendor.url          Java 供应商的 URL<br />java.home Java           安装目录<br />java.vm.specification.version       Java 虚拟机规范版本<br />java.vm.specification.vendor       Java 虚拟机规范供应商<br />java.vm.specification.name        Java 虚拟机规范名称<br />java.vm.version          Java 虚拟机实现版本<br />java.vm.vendor           Java 虚拟机实现供应商<br />java.vm.name           Java 虚拟机实现名称<br />java.specification.version        Java 运行时环境规范版本<br />java.specification.vendor        Java 运行时环境规范供应商<br />java.specification.name        Java 运行时环境规范名称<br />java.class.version          Java 类格式版本号<br />java.class.path          Java 类路径<br />java.library.path          加载库时搜索的路径列表<br />java.io.tmpdir           默认的临时文件路径<br />java.compiler           要使用的 JIT 编译器的名称<br />java.ext.dirs           一个或多个扩展目录的路径<br />os.name            操作系统的名称<br />os.arch            操作系统的架构<br />os.version            操作系统的版本<br />file.separator           文件分隔符（在 UNIX 系统中是“/”）<br />path.separator           路径分隔符（在 UNIX 系统中是“:”）<br />line.separator           行分隔符（在 UNIX 系统中是“/n”）<br />user.name            用户的账户名称<br />user.home            用户的主目录<br />user.dir            用户的当前工作目录 <br /><img src ="http://www.blogjava.net/tingfeng/aggbug/263698.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2009-04-03 11:18 <a href="http://www.blogjava.net/tingfeng/articles/263698.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Vector随记</title><link>http://www.blogjava.net/tingfeng/articles/225539.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Fri, 29 Aug 2008 04:35:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/225539.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/225539.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/225539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/225539.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/225539.html</trackback:ping><description><![CDATA[
		<p>今天修改一个点集，是一个Vector类型的变量，point。变量的每一条记录是一个自定义类coo，也很简单，只有x,y两个属性，都是int型的。<br />要实现的功能很简单，就是把point里的每个x计算一下，x=x*r1/r2。因为在point里边是不能直接进行运算的，所以要把相应的值读出来，运算，再插进去——这就是我开始的思路。后来行不通，改成又新建了一个Vector变量，运算完后，查到这个变量后边，然后在进行一个复制操作。<br />更改前的代码（大致的）：</p>
		<p>1 coo one=new coo();<br />2 for（int i=0;i&lt;point.size();i++）{<br />3 one=point.get(i);<br />4 one.x=one.x*r1/r2;<br />5 point.remove(i);<br />6 point.add(i,one);<br />7 }</p>
		<p>这段代码的错误很多，简单分析一下。<br />one 并没有分配内存，所以3行获得的只是一个地址，4行操作的也只是把地址为i的内容操作了；<br />5行逻辑也是错误的，因为地址i的数据就是计算后的，把正确的删掉了又把第i行（就是删除前的第i+1行），插了进去，弄来弄去，全乱套了。<br /><br />下面是正确的代码正确的代码：</p>
		<p>for (int i = 0; i &lt; pointV.size(); i++) {<br />    point_hold = new coordinate();<br />    point_hold.x = ((coordinate) pointV.get(i)).x;<br />    point_hold.y = ((coordinate) pointV.get(i)).y;<br />    point_hold.x = point_hold.x * Reflectance_hold<br />      / Reflectance; <br />    pointH.add(point_hold);    <br />   }<br />   <br />   pointV.clear();<br />   pointV=(Vector)pointH.clone();<br />   pointH.clear();<br /><br />其实这段代码用的是最笨的办法，不多说了，以后多注意。</p>
<img src ="http://www.blogjava.net/tingfeng/aggbug/225539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2008-08-29 12:35 <a href="http://www.blogjava.net/tingfeng/articles/225539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>synchronized 小记</title><link>http://www.blogjava.net/tingfeng/articles/223029.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Tue, 19 Aug 2008 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/223029.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/223029.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/223029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/223029.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/223029.html</trackback:ping><description><![CDATA[synchronized是一个关键字，他的作用就是给canvas加互斥锁标记 <br />他可以锁方法，也可以锁一段代码块 <br /><br />synchronized(变量canvas){代码块}这种格式就是锁定该代码块中的这个变量<br /><br />当一个线程执行到代码块里之后 <br />canvas的锁就交给了这个对象 <br />其他的线程就不能执行这段代码块了，只能等待正在执行的那个线程执行完了那段代码块之后，才有机会拿到canvas的锁标记，这样他才有机会去执行那段代码 <br /><br /><br />比喻 <br />canvas是一个漂亮的小妞，她被synchronized修饰了，她就有一锁标记，只有拿到这把锁标记的人才可以是她的男朋友 <br />现在我很幸运，拿到了这把锁，我就可以调用这小妞的牵手方法，接吻方法，等等。 <br />但是就在我和她交往的同时，你也要和她牵手，或者更多的男人要和她牵手， <br />对不起，你没拿到锁，不能有这些方法调用，你和他们就只能等待，等到什么时候呢，等到我和她分手为止，到分手的时候，我就释放了她的锁标记，你和其他的男人就去抢...... <br /><br />这里的小妞就是canvas对象 <br />我和你们都是一个线程 <br />加了synchronized，就防止了多线程并发访问的不好后果~<img src ="http://www.blogjava.net/tingfeng/aggbug/223029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2008-08-19 15:51 <a href="http://www.blogjava.net/tingfeng/articles/223029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>音频播放的简单程序</title><link>http://www.blogjava.net/tingfeng/articles/218313.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Tue, 29 Jul 2008 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/218313.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/218313.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/218313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/218313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/218313.html</trackback:ping><description><![CDATA[这是一个音频播放的简单程序，是对网上的一个程序改造的，是把它简单化了。<br />其中的stop（）、pause（）函数都没有使用。<br />该程序支持.wav格式的音频，改掉主函数中的音频名字，就可以直接运行。音频播放完会自动关闭。<br />public class AudioPlay<br />implements Runnable {<br /> private JavaSoundAudioClip locate, warning;<br /> protected boolean threadExit;<br /> protected boolean stopped;<br /> protected boolean playing;<br /> Thread playerThread;<br /> public AudioPlay() {<br /> }<br /> public void start(File f) {<br />  playing = true;<br />  stopped = false;<br />  try {<br />   FileInputStream ff = new FileInputStream(f);<br />   locate = new JavaSoundAudioClip(ff);<br />  }<br />  catch (Exception e) {<br />   e.printStackTrace();<br />  }<br />  playerThread = new Thread(this);<br />  playerThread.start();<br /> }<br /> public void run() {<br />  if (playing) {<br />   if (!stopped) {<br />    if (locate == null)<br />     System.out.print("nulll");<br />    try {<br />     locate.play();<br />     System.out.print("test");<br />    }<br />    catch (Exception ee) {<br />     ee.printStackTrace();<br />    }<br />   }<br />  }<br /> }<br /> public void stop() {<br />  stopped = true;<br />  threadExit = true;<br />  if (playing == true) {<br />   playing = false;<br />   locate.stop();<br />  }<br /> }<br /> public void pause() {<br />  if (playing == true) {<br />   locate.stop();<br />  }<br /> }<br /> <br /> public static void main(String a[]){<br />  <br />  AudioPlay sound=new AudioPlay();<br />  try{<br />  <br />  File f=new File("Sound/Contagious.wav");//用适当的路径和文件名替换<br />  sound.start(f);<br />  }catch(Exception e){<br />   e.printStackTrace();<br />  }<br />  <br /> }<br />} <img src ="http://www.blogjava.net/tingfeng/aggbug/218313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2008-07-29 11:38 <a href="http://www.blogjava.net/tingfeng/articles/218313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA调用数据库的存储过程</title><link>http://www.blogjava.net/tingfeng/articles/216628.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Tue, 22 Jul 2008 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/216628.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/216628.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/216628.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/216628.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/216628.html</trackback:ping><description><![CDATA[下午调试了一个调用数据库存储过程的片段，居然弄了两三个小时，下边小小总结一下。<br />关键代码：<br />1    String sql="CALL pkg_rfts_global.sp_gui_delete_Object(?)";<br />2    CallableStatement inoutProc=(CallableStatement) conn.prepareCall(sql);<br />3    inoutProc.registerOutParameter(1,4);<br />4    inoutProc.setInt(1,9450）;<br />5    inoutProc.execute();<br />6    inoutProc.close();<br /><br />整个过程就如上了，sql就是一个存储字符串的变量；con是事先已经和数据库连接好的连接（Connection类）；inoutProc就是CallableStatement 类的一个实例；<br />第一句话就是要执行的命令语句，pkg_rfts_global是包名，sp_gui_delete_Object是存储过程名，看老师给我们演示时还有在最前面加入登陆用户名的，这里没有也通过了，可能是已经登陆的原因。小括号里是变量，这里是在存储过程中定义的，这个存储过程就定义了一个变量。第三行是设置变量输出时的大小，如registerOutParameter方法指定了上述的第一个参数大小为4；第三句话是设置参数，setInt方法设置了第一个参数的整形值为9450；第五句话开始执行这个语句；最后关闭。<br />出现的问题（因为是第一次用，很弱智的说）：<br />1、没有加CALL；<br />2、在语句后面多了一个“；”；<br /><br />再贴几句话：<br />                cs.registerOutParameter(2, java.sql.Types.INTEGER);<br />                cs.registerOutParameter(4, java.sql.Types.VARCHAR);<br />                cs.registerOutParameter(10, java.sql.Types.FLOAT);<br />                cs.registerOutParameter(20, java.sql.Types.VARCHAR);<br />cs和inoutProc是一个类型了，这是在定义变量输出时大小的另外一种方法。<img src ="http://www.blogjava.net/tingfeng/aggbug/216628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2008-07-22 15:46 <a href="http://www.blogjava.net/tingfeng/articles/216628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RMI连接的简单例子</title><link>http://www.blogjava.net/tingfeng/articles/190706.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Thu, 03 Apr 2008 13:47:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/190706.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/190706.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/190706.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/190706.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/190706.html</trackback:ping><description><![CDATA[<p>自己依照已有的源代码，主要是在JMX框架下，实现了RMI远程调用的一个简单的例子，主要是为了验证RMI调用时文件的配置情况。<br />主要有forPlay类及对应的MBean，Server端以及client端，其中，clint端是和其他文件异地配置的，在同一台机子上更没问题了。通过RMI远程连接，我们可以实现一个瘦客户端的，即主要的MBean是放在Server端，客户端使用相应的类时，只需要通过RMI调用就行了，另外，MBean只需和服务器同包放置或者服务器能够找到的位置，无须显式的注册，这是我实现这个程序的主要目的。<br />server端的源代码和<a id="viewpost1_TitleUrl" href="/tingfeng/articles/187793.html"><font color="#0000ff">JMX下RMI远程调用的入门（环境变量的设置）</font></a>里面的Server.java文件是一样的，涉及到环境变量以及如何运行，这篇文章里也有详细介绍。这里只给出我今天写的一段代码<br />整个程序一共有四个文件<br />forReplay.java、forReplayMBean.java、Client.java以及前面说到的Server.java，这里给出前三个文件的代码：<br />***********************************************************<br />forReplay.java<br />***************************************<br />public class forReplay </p>
		<p>&nbsp;implements forReplayMBean{<br />&nbsp;<br />&nbsp;private String State="待调用";<br />&nbsp;<br />&nbsp;public void play(){<br />&nbsp;&nbsp;System.out.println("play函数调用成功！");<br />&nbsp;&nbsp;<br />&nbsp;}</p>
		<p>&nbsp;public String getState() {<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;return State;<br />&nbsp;}</p>
		<p>&nbsp;public void setState(String s) {<br />&nbsp;&nbsp;State=s;<br />&nbsp;&nbsp;<br />&nbsp;}</p>
		<p>}<br />***********************************************************<br />***********************************************************<br />forReplayMBean.java<br />***************************************<br />public interface forReplayMBean {<br />&nbsp;<br />&nbsp;public String getState();<br />&nbsp;public void setState(String s);<br />&nbsp;public void play();</p>
		<p>}<br />***********************************************************<br />***********************************************************<br />Client.java<br />***************************************<br />import javax.management.MBeanServerConnection;<br />import javax.management.ObjectName;<br />import javax.management.remote.JMXConnector;<br />import javax.management.remote.JMXConnectorFactory;<br />import javax.management.remote.JMXServiceURL;</p>
		<p>public class Client {</p>
		<p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 创建RMI连接客户端到RMI连接服务器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JMXServiceURL url = new JMXServiceURL(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "service:jmx:rmi:///jndi/rmi://localhost:9999/server");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JMXConnector jmxc = JMXConnectorFactory.connect(url, null);</p>
		<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 获得一个MBean服务器连接<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();</p>
		<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建一个forPlay类<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectName mbeanName = new ObjectName("chengang:name=forReplay");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbsc.createMBean("forReplay", mbeanName, null, null);</p>
		<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nMBean数量为" + mbsc.getMBeanCount());// 获得Mbean的数量<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbsc.invoke(mbeanName,"play", null, null);//调用forPlay类中的play（）函数</p>
		<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(2000);//挂起2000毫秒，等待服务器反应.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbsc.unregisterMBean(mbeanName); //注销MBean的注册,不是必要的<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmxc.close();// 关闭连接，不是必要的<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}<br /><br />***********************************************************<br />***********************************************************<br /><br /></p><img src ="http://www.blogjava.net/tingfeng/aggbug/190706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2008-04-03 21:47 <a href="http://www.blogjava.net/tingfeng/articles/190706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>main函数参数中args的意思</title><link>http://www.blogjava.net/tingfeng/articles/190307.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Wed, 02 Apr 2008 03:16:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/190307.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/190307.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/190307.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/190307.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/190307.html</trackback:ping><description><![CDATA[
		<p>public static void main(arge[])</p>
		<p>此函数（符合上述格式）是程序的入口，系统会在一开始调用此函数以开始程序的运行。<br /><br /><br />public 公用的，表示该方法共有，可以被外部访问 <br />static 静态的,运行自动加载，程序运行时会在最开始实例化static类型的东西，比如这里的main函数 <br />void 表示该方法不返回任何数值 <br />main 是函数名 <br />String[] args表示args是一个String类型的数组，存放参数，实际上args是可以随意改变的<br /><br /><span class="javascript" id="text125980">有一个例子可以帮助我们理解:<br /><span class="javascript" id="text126446"> <br />public class Message{<br />public static void main(String[] a){<br />if(a[0].equals("-h"))<br />System.out.println("hello world");<br />else if(a[0].equals("-g"))<br />System.out.println("goodbye ");<br />for(int i=0;i&lt;a.length;i++)<br />System.out.println(""+a[i]);<br /><br />}<br />}<br /><br />运行时为java Message -h<br />或者 java Message -g<br />在后面再加字符串也可以<br /><br />a实际上就是一个字符数组的名字，作用是用来存储java Message后面跟着传进来的参数。名字可以自定义，但是你改成数字当然不行了，需要符合java中变量的命名规则。如果代码里没有用到这个数组的话随便改都没有问题。但是如果程序里面使用了这个数组的话，改名就需要同时将调用的地方一起改掉。</span></span></p>
		<p>
				<span class="javascript">因为java不知道你是不是会带参数执行。例如java Message 或者 java Message Hello。如果不允许args参数。那么可以在程序中通过<br />if (args.length!=0) System.out.println("此程序不允许带参数执行");<br />来避免出现无法处理的错误<br /><br /><span class="javascript" id="text131561">一个main()函数只有是 main(String[] x)才是系统的main函数， 程序开始执行的函数。其实它也不过是一个函数而已，你不必想像为一个很特殊的东西，只是系统会去主动找这个函数来执行，你也可以在程序中主动调用main(String[])，当然大多数情况下这都没有必要。<br /><br />如果不加参数"String[]"，就不是原来这个main函数了，只能叫做自己定义的一个函数。 至于String[] x 中的x 只是一个变量名，随便你定义。 </span><br /></span>
		</p>
		<p>
				<span class="javascript"> </span>
		</p>
<img src ="http://www.blogjava.net/tingfeng/aggbug/190307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2008-04-02 11:16 <a href="http://www.blogjava.net/tingfeng/articles/190307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Properties 类读取配置文件信息</title><link>http://www.blogjava.net/tingfeng/articles/189356.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Fri, 28 Mar 2008 13:33:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/189356.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/189356.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/189356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/189356.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/189356.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java Properties 类读取配置文件信息    在我们平时写程序的时候，有些参数是经常改变的，而这种改变不是我们预知的。比如说我们开发了一个操作数据库的模块，在开发的时候我们连接本地的数据库那么IP，数据库名称，表名称，数据库主机等信息是我们本地的，要使得这个操作数据的模块具有通用性，那么以上信息就不能写死在程序里。通常我们的做法是用配置文件来解决。各种语言都有自己所支持的配置文件类...&nbsp;&nbsp;<a href='http://www.blogjava.net/tingfeng/articles/189356.html'>阅读全文</a><img src ="http://www.blogjava.net/tingfeng/aggbug/189356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2008-03-28 21:33 <a href="http://www.blogjava.net/tingfeng/articles/189356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据连接池</title><link>http://www.blogjava.net/tingfeng/articles/189354.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Fri, 28 Mar 2008 13:26:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/189354.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/189354.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/189354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/189354.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/189354.html</trackback:ping><description><![CDATA[数据库连接池概述： <br />数据库连接是一种关键的有限的昂贵的资源，这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性，影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。 <br />数据库连接池负责分配、管理和释放数据库连接，它允许应用程序重复使用一个现有的数据库连接，而再不是重新建立一个；释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。 <br />数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中，这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用，连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数，当应用程序向连接池请求的连接数超过最大连接数量时，这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素： <br />1) 最小连接数是连接池一直保持的数据库连接，所以如果应用程序对数据库连接的使用量不大，将会有大量的数据库连接资源被浪费； <br />2) 最大连接数是连接池能申请的最大连接数，如果数据库连接请求超过此数，后面的数据库连接请求将被加入到等待队列中，这会影响之后的数据库操作。 <br />3) 如果最小连接数与最大连接数相差太大，那么最先的连接请求将会获利，之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过，这些大于最小连接数的数据库连接在使用完不会马上被释放，它将被放到连接池中等待重复使用或是空闲超时后被释放。<img src ="http://www.blogjava.net/tingfeng/aggbug/189354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2008-03-28 21:26 <a href="http://www.blogjava.net/tingfeng/articles/189354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习Rose的一些连接</title><link>http://www.blogjava.net/tingfeng/articles/189275.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Fri, 28 Mar 2008 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/189275.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/189275.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/189275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/189275.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/189275.html</trackback:ping><description><![CDATA[建模工具Rose的学习（1）&nbsp; <a href="http://www.3800hk.com/Article/cxsj/UML/bcjquml/2005-08-06/Article_20491.html">http://www.3800hk.com/Article/cxsj/UML/bcjquml/2005-08-06/Article_20491.html</a><br />&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://hi.baidu.com/suofang/blog/item/b2ddbf1c2694968a87d6b6c4.html">http://hi.baidu.com/suofang/blog/item/b2ddbf1c2694968a87d6b6c4.html</a><br /><br />Rose的学习使用 <a href="http://blog.csdn.net/kaibinsj/archive/2005/01/05/240924.aspx">http://blog.csdn.net/kaibinsj/archive/2005/01/05/240924.aspx</a><br /><br />UML语言和ROSE学习<a href="http://huyong913.bokee.com/viewdiary.18655826.html">http://huyong913.bokee.com/viewdiary.18655826.html</a><br /><br /><font color="#000000">UML框图</font><a href="http://blog.chinaunix.net/u1/36131/showart_347555.html">http://blog.chinaunix.net/u1/36131/showart_347555.html</a><img src ="http://www.blogjava.net/tingfeng/aggbug/189275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2008-03-28 15:03 <a href="http://www.blogjava.net/tingfeng/articles/189275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库连接</title><link>http://www.blogjava.net/tingfeng/articles/189250.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Fri, 28 Mar 2008 05:30:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/189250.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/189250.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/189250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/189250.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/189250.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">1．  加载一个对应数据库的JDBC驱动<br />　　在建立到一个数据库的连接之前，必须先加载这个数据库的JDBC驱动程序，加载之后此driver会自动注册到JDBC驱动列表中。加载一个</font>
		</p>
		<p>
				<font size="2">JDBC驱动有两种方法。<br />　　a）  在命令行方式下指定驱动器或者用冒号分割驱动器列表：<br />　　具体命令如下：<br />      C:\&gt;java –Djdbc.drivers = com.company1.Driver:com.company2.Driver youProject<br />　　b)第二种方法，在程序中调用Class.forName（）方法。推荐使用。。。。<br />              try<br />　　{<br />　　   String driverName = “com.imaginary.sql.msql.MsqlDriver”;<br />　　   Class.forName(driverName).newInstance();<br />　　}<br />              Catch(ClassNotFoundException e1)<br />                 {<br />            //catch could not find database driver exception.<br />　　  }<br />　　2.连接到数据库。　　<br />　　根据您后台待连接的数据库不同，而有小小的差别。<br /><strong>　　a)       连接到Oracle数据库。</strong><br />　　Connection connection = null ;<br />　　try<br />　　{ <br />　　  //load the jdbc driver ; <br /> 　　 String driverName = “oracle.jdbc.driver.OracleDriver”;<br /> 　　 Class.forName(driverName).newInstance();<br />　　 //create a connection to the database;<br /> 　　 String serverName = “127.0.0.1”; <br /> 　　 String serverPort = “1521”;<br /> 　　 String serverID = “datebase1”<br /> 　　 String userName = “hello”;<br /> 　　 String userPsw = “world”;<br /> 　　 String url = “jdbc:oracle.thin:@” + serverName + “:” + serverPort + “:” + serverID ;<br /> 　　 Connection = DriverManager.getConnection(url , userName , userPsw);<br />　　}<br />　　catch(ClassNotFoundException e1)<br />　　{<br />　　  //catch could not find database driver exception.<br />　　}<br />　　catch(SQLException e2)<br />　　{<br /> 　　 //catch could not connect to the database exception.<br />　　}<br />　<strong>　b)      连接到一个SQL Server数据库。</strong><br />   　　Connection connection = null ;<br />　　try<br />　　{ <br />　　  //load the jdbc driver ; <br /> 　　 String driverName = “com.microsoft.jdbc.sqlserver.SQLServerDriver”;<br />　　  Class.forName(driverName).newInstance();<br />  　　 //create a connection to the database;<br />　　  String serverName = “127.0.0.1”; <br />　　  String serverPort = “1433”;<br /> 　　 String serverID =  serverName + serverPort ; <br />　　  String userName = “hello”;<br /> 　　 String userPsw = “world”;<br /> 　　 String url = “jdbc:JSQLConnect ://” + serverID ;<br /> 　　 Connection = DriverManager.getConnection(url , userName , userPsw);<br />　　}<br />　　catch(ClassNotFoundException e1)<br />　　{<br />　　  //catch could not find database driver exception.<br />　　}<br />　　catch(SQLException e2)<br />　　{<br />　　  //catch could not connect to the database exception.<br />　　}<br /><strong>　　c)      连接到一个MySQL数据库上。。。。</strong><br />          Connection connection = null ;<br />　　try<br />　　{ <br />　　  //load the jdbc driver ; <br />　　  String driverName = “org.gjt.mm.mysql.Driver”;<br />　　  Class.forName(driverName).newInstance();<br />  　　  //create a connection to the database;<br />　　  String serverName = “127.0.0.1”; <br />　　  String serverID =  “database”; <br />　　  String userName = “hello”;<br />　　  String userPsw = “world”;<br />　　  String url = “jdbc:mysql ://” + serverName + “/” + serverID ;<br />　　  Connection = DriverManager.getConnection(url , userName , userPsw);<br />　　}<br />　　catch(ClassNotFoundException e1)<br />　　{<br />　　  //catch could not find database driver exception.<br />　　}<br />　　catch(SQLException e2)<br />　　{<br />　　  //catch could not connect to the database exception.<br />　　}</font>
		</p>
		<p>
				<font size="2">　　综合上面的三种数据库连接方式 ， 其实大同小异。由于访问不同的数据库和所使用的数据库驱动程序不同，所以导致代码表面上有小小</font>
		</p>
		<p>
				<font size="2">不同，但透过表面看来，内部都是</font>
		</p>
		<p>
				<font size="2">　　1．  加载一个特定的数据库JDBC驱动。<br />　　2．  连接到一个数据库。<br />　　3．  之后，就可以对一个特定的数据库进行特定的操作了。</font>
		</p>
		<p>
				<font size="2">
				</font> </p>
		<font size="2">
				<p>
						<br />
						<strong>1、Oracle8/8i/9i数据库（thin模式）</strong>
						<br />Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); <br />String url="jdbc:oracle:thin:@localhost:1521:orcl"; <br />//orcl为数据库的SID <br />String user="test"; <br />String password="test"; <br />Connection conn= DriverManager.getConnection(url,user,password); </p>
				<p>
						<strong>2、DB2数据库</strong>
						<br />Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); <br />String url="jdbc:db2://localhost:5000/sample"; <br />//sample为你的数据库名 <br />String user="admin"; <br />String password=""; <br />Connection conn= DriverManager.getConnection(url,user,password); </p>
				<p>
						<strong>3、Sql Server7.0/2000数据库</strong>
						<br />Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); <br />String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"; <br />//mydb为数据库 <br />String user="sa"; <br />String password=""; <br />Connection conn= DriverManager.getConnection(url,user,password); </p>
				<p>
						<strong>4、Sybase数据库</strong>
						<br />Class.forName("com.sybase.jdbc.SybDriver").newInstance(); <br />String url =" jdbc:sybase:Tds:localhost:5007/myDB"; <br />//myDB为你的数据库名 <br />Properties sysProps = System.getProperties(); <br />SysProps.put("user","userid"); <br />SysProps.put("password","user_password"); <br />Connection conn= DriverManager.getConnection(url, SysProps); </p>
				<p>
						<strong>5、Informix数据库</strong>
						<br />Class.forName("com.informix.jdbc.IfxDriver").newInstance(); <br />String url = <br />"jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver; <br />user=testuser;password=testpassword"; <br />//myDB为数据库名 <br />Connection conn= DriverManager.getConnection(url); </p>
				<p>
						<strong>6、MySQL数据库</strong>
						<br />Class.forName("org.gjt.mm.mysql.Driver").newInstance(); <br />String url ="jdbc:mysql://localhost/myDB?user=soft&amp;password=soft1234&amp;useUnicode=true&amp;characterEncoding=8859_1" <br />//myDB为数据库名 <br />Connection conn= DriverManager.getConnection(url); </p>
				<p>
						<strong>7、PostgreSQL数据库</strong>
						<br />Class.forName("org.postgresql.Driver").newInstance(); <br />String url ="jdbc:postgresql://localhost/myDB" <br />//myDB为数据库名 <br />String user="myuser"; <br />String password="mypassword"; <br />Connection conn= DriverManager.getConnection(url,user,password); <br /></p>
		</font>
		<p>
				<font size="2">
				</font>
		</p>
<img src ="http://www.blogjava.net/tingfeng/aggbug/189250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2008-03-28 13:30 <a href="http://www.blogjava.net/tingfeng/articles/189250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JMX下RMI远程调用的入门（环境变量的设置）</title><link>http://www.blogjava.net/tingfeng/articles/187793.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Fri, 21 Mar 2008 12:46:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/187793.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/187793.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/187793.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/187793.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/187793.html</trackback:ping><description><![CDATA[<p>RMI是用来坐远程管理的，如可以是在C/S模式下负责客户端和服务器端的通信。<br />
参照sun提供的jmxremote-1_0_1-bin文档，在\examples\Basic\rmi里我们可以找到5个.JAVA文件<br />
<code class="cCode">Server.java</code>、<code class="cCode">SimpleStandardMBean.java</code>、<code class="cCode">SimpleStandard.java</code>、<code class="cCode">ClientListener.java</code>、<code class="cCode">Client.java<br />
</code>除了运行上边5个文件以外，为了客户端和服务器端能够连上，还要设置环境变量，以及在DOS下运行一个注册端口的命令，后面再加以详细说明。<br />
<br />
源代码如下：<br />
****************************************************************<br />
<code class="cCode">第一个源文件 Server.java</code><br />
**************************************<br />
import javax.management.MBeanServer;<br />
import javax.management.MBeanServerFactory;<br />
import javax.management.remote.JMXConnectorServer;<br />
import javax.management.remote.JMXConnectorServerFactory;<br />
import javax.management.remote.JMXServiceURL;</p>
<p>public class Server {</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Instantiate the MBean server<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nCreate the MBean server");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MBeanServer mbs = MBeanServerFactory.createMBeanServer();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create an RMI connector server<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nCreate an RMI connector server");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JMXServiceURL url = new JMXServiceURL(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "service:jmx:rmi:///jndi/rmi://219.242.119.89:9999/server");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JMXConnectorServer cs =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Start the RMI connector server<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nStart the RMI connector server");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nRMI connector server successfully started");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nWaiting for incoming connections...");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
************************************************************************<br />
<code class="cCode">第2个源文件SimpleStandardMBean.java</code><br />
*******************************<br />
</p>
<p>import javax.management.AttributeChangeNotification;<br />
import javax.management.NotificationBroadcasterSupport;</p>
<p>public class SimpleStandard<br />
&nbsp;&nbsp;&nbsp; extends NotificationBroadcasterSupport<br />
&nbsp;&nbsp;&nbsp; implements SimpleStandardMBean {</p>
<p>&nbsp;&nbsp;&nbsp; /*<br />
&nbsp;&nbsp;&nbsp;&nbsp; * -----------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp; * CONSTRUCTORS<br />
&nbsp;&nbsp;&nbsp;&nbsp; * -----------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp; /* "SimpleStandard" does not provide any specific constructors.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * However, "SimpleStandard" is JMX compliant with regards to<br />
&nbsp;&nbsp;&nbsp;&nbsp; * contructors because the default contructor SimpleStandard()<br />
&nbsp;&nbsp;&nbsp;&nbsp; * provided by the Java compiler is public.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp; /*<br />
&nbsp;&nbsp;&nbsp;&nbsp; * -----------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp; * IMPLEMENTATION OF THE SimpleStandardMBean INTERFACE<br />
&nbsp;&nbsp;&nbsp;&nbsp; * -----------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Getter: get the "State" attribute of the "SimpleStandard" standard MBean.<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return the current value of the "State" attribute.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String getState() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return state;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /** <br />
&nbsp;&nbsp;&nbsp;&nbsp; * Setter: set the "State" attribute of the "SimpleStandard" standard MBean.<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param &lt;VAR&gt;s&lt;/VAR&gt; the new value of the "State" attribute.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void setState(String s) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; state = s;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nbChanges++;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Getter: get the "NbChanges" attribute of the "SimpleStandard" standard<br />
&nbsp;&nbsp;&nbsp;&nbsp; * MBean.<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return the current value of the "NbChanges" attribute.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public int getNbChanges() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return nbChanges;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Operation: reset to their initial values the "State" and "NbChanges"<br />
&nbsp;&nbsp;&nbsp;&nbsp; * attributes of the "SimpleStandard" standard MBean.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void reset() {<br />
&nbsp;AttributeChangeNotification acn =<br />
&nbsp;&nbsp;&nbsp;&nbsp; new AttributeChangeNotification(this,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "NbChanges reset",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "NbChanges",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Integer",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Integer(nbChanges),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Integer(0));<br />
&nbsp;state = "initial state";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nbChanges = 0;<br />
&nbsp;nbResets++;<br />
&nbsp;sendNotification(acn);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /*<br />
&nbsp;&nbsp;&nbsp;&nbsp; * -----------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp; * METHOD NOT EXPOSED FOR MANAGEMENT BY A JMX AGENT<br />
&nbsp;&nbsp;&nbsp;&nbsp; * -----------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Return the "NbResets" property.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * This method is not a Getter in the JMX sense because it<br />
&nbsp;&nbsp;&nbsp;&nbsp; * is not exposed in the "SimpleStandardMBean" interface.<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return the current value of the "NbResets" property.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public int getNbResets() {<br />
&nbsp;return nbResets;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /*<br />
&nbsp;&nbsp;&nbsp;&nbsp; * -----------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp; * ATTRIBUTES ACCESSIBLE FOR MANAGEMENT BY A JMX AGENT<br />
&nbsp;&nbsp;&nbsp;&nbsp; * -----------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp; private String state = "initial state";<br />
&nbsp;&nbsp;&nbsp; private int nbChanges = 0;</p>
<p>&nbsp;&nbsp;&nbsp; /*<br />
&nbsp;&nbsp;&nbsp;&nbsp; * -----------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp; * PROPERTY NOT ACCESSIBLE FOR MANAGEMENT BY A JMX AGENT<br />
&nbsp;&nbsp;&nbsp;&nbsp; * -----------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp; private int nbResets = 0;<br />
}<br />
</p>
<p><br />
<br />
************************************************************************<br />
<code class="cCode">第3个源文件 SimpleStandard.java</code><br />
*******************************<br />
</p>
<p>/**<br />
&nbsp;* This is the management interface explicitly defined for the<br />
&nbsp;* "SimpleStandard" standard MBean.<br />
&nbsp;*<br />
&nbsp;* The "SimpleStandard" standard MBean implements this interface<br />
&nbsp;* in order to be manageable through a JMX agent.<br />
&nbsp;*<br />
&nbsp;* The "SimpleStandardMBean" interface shows how to expose for management:<br />
&nbsp;* - a read/write attribute (named "State") through its getter and setter<br />
&nbsp;*&nbsp;&nbsp; methods,<br />
&nbsp;* - a read-only attribute (named "NbChanges") through its getter method,<br />
&nbsp;* - an operation (named "reset").<br />
&nbsp;*/<br />
public interface SimpleStandardMBean {</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Getter: set the "State" attribute of the "SimpleStandard" standard<br />
&nbsp;&nbsp;&nbsp;&nbsp; * MBean.<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return the current value of the "State" attribute.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String getState();</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Setter: set the "State" attribute of the "SimpleStandard" standard<br />
&nbsp;&nbsp;&nbsp;&nbsp; * MBean.<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param &lt;VAR&gt;s&lt;/VAR&gt; the new value of the "State" attribute.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void setState(String s);</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Getter: get the "NbChanges" attribute of the "SimpleStandard" standard<br />
&nbsp;&nbsp;&nbsp;&nbsp; * MBean.<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return the current value of the "NbChanges" attribute.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public int getNbChanges();</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Operation: reset to their initial values the "State" and "NbChanges"<br />
&nbsp;&nbsp;&nbsp;&nbsp; * attributes of the "SimpleStandard" standard MBean.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void reset();<br />
}<br />
</p>
<p><br />
************************************************************************<br />
<code class="cCode">第4个源文件ClientListener.java<br />
*******************************</code></p>
<p>import javax.management.Notification;<br />
import javax.management.NotificationListener;</p>
<p>public class ClientListener implements NotificationListener {<br />
&nbsp;&nbsp;&nbsp; public void handleNotification(Notification notification, Object handback) {<br />
&nbsp;System.out.println("\nReceived notification: " + notification);<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
*************************************************************************<br />
<code class="cCode">第5个源文件Client.java</code><br />
********************************<br />
</p>
<p>import javax.management.Attribute;<br />
import javax.management.MBeanServerConnection;<br />
import javax.management.MBeanServerInvocationHandler;<br />
import javax.management.ObjectName;<br />
import javax.management.remote.JMXConnector;<br />
import javax.management.remote.JMXConnectorFactory;<br />
import javax.management.remote.JMXServiceURL;</p>
<p>public class Client {</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create an RMI connector client and<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // connect it to the RMI connector server<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nCreate an RMI connector client and " +<br />
&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;&nbsp; "connect it to the RMI connector server");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JMXServiceURL url = new JMXServiceURL(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "service:jmx:rmi:///jndi/rmi://219.242.119.89:9999/server");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JMXConnector jmxc = JMXConnectorFactory.connect(url, null);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get an MBeanServerConnection<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nGet an MBeanServerConnection");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get domains from MBeanServer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nDomains:");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String domains[] = mbsc.getDomains();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; domains.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\tDomain[" + i + "] = " + domains[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create SimpleStandard MBean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectName mbeanName = new ObjectName("MBeans:type=SimpleStandard");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nCreate SimpleStandard MBean...");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbsc.createMBean("SimpleStandard", mbeanName, null, null);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get MBean count<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nMBean count = " + mbsc.getMBeanCount());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get State attribute<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nState = " +<br />
&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;&nbsp; mbsc.getAttribute(mbeanName, "State"));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Set State attribute<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbsc.setAttribute(mbeanName,<br />
&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; new Attribute("State", "changed state"));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get State attribute<br />
&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp; // Another way of interacting with a given MBean is through a<br />
&nbsp;&nbsp;&nbsp;&nbsp; // dedicated proxy instead of going directly through the MBean<br />
&nbsp;&nbsp;&nbsp;&nbsp; // server connection<br />
&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp; SimpleStandardMBean proxy = (SimpleStandardMBean)<br />
&nbsp;&nbsp;MBeanServerInvocationHandler.newProxyInstance(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbsc,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbeanName,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SimpleStandardMBean.class,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; false);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nState = " + proxy.getState());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add notification listener on SimpleStandard MBean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClientListener listener = new ClientListener();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nAdd notification listener...");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbsc.addNotificationListener(mbeanName, listener, null, null);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Invoke "reset" in SimpleStandard MBean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Calling "reset" makes the SimpleStandard MBean emit a<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // notification that will be received by the registered<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ClientListener.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nInvoke reset() in SimpleStandard MBean...");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbsc.invoke(mbeanName, "reset", null, null);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Sleep for 2 seconds in order to have time to receive the<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // notification before removing the notification listener.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nWaiting for notification...");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(2000);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Remove notification listener on SimpleStandard MBean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nRemove notification listener...");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbsc.removeNotificationListener(mbeanName, listener);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Unregister SimpleStandard MBean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nUnregister SimpleStandard MBean...");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbsc.unregisterMBean(mbeanName);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Close MBeanServer connection<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nClose the connection to the server");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmxc.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\nBye! Bye!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
</p>
************************************************************<br />
运行前，还有两件事要做：<br />
1、先设置6个环境变量：<br />
变量名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;变量值<br />
<p class="pBody"><span class="cUserType">RJMX_HOME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><em class="cEmphasis">user_dir</em><span class="cUserType">/jmxremote-1_0_1-bin</span> </p>
<p class="pBody"><span class="cUserType">JMX_HOME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><em class="cEmphasis">jmx_install_dir</em> </p>
<p class="pBody"><span class="cUserType">RJMXLIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{RJMX_HOME}/lib</span> </p>
<p class="pBody"><span class="cUserType">JMXLIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{JMX_HOME}/lib</span> <br />
<span class="cUserType">classp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${RJMXLIB}/jmxremote.jar:${JMXLIB}/jmxri.jar</span> <br />
CLASSPATH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.:$classp <br />
其中<em class="cEmphasis">user_dir</em>为jmxremote-1_0_1-bin这个文件夹所在的目录，如我的设置完为C:\Program Files\Java\otherlib\jmxremote-1_0_1-bin；<br />
<em class="cEmphasis">jmx_install_dir</em> 为JMX包的文件jmx-1_2_1-bin文件夹所在的目录，我的为C:\Program Files\Java\otherlib\jmx-1_2_1-bin<br />
2、运行一个命令。<br />
这个命令我也不太懂，要在DOS下运行，命令行格式为rmiregistry 9999<br />
我的运行时命令行整体为<br />
C:\Documents and Settings\tingfeng&gt;rmiregistry 9999<br />
回车以后运行，它就会停下来，然后就可以启动server端了，再启动Client。</p>
<br />
<img src ="http://www.blogjava.net/tingfeng/aggbug/187793.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2008-03-21 20:46 <a href="http://www.blogjava.net/tingfeng/articles/187793.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>1.1.2什么是JAVA dmk ？</title><link>http://www.blogjava.net/tingfeng/articles/186578.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Sun, 16 Mar 2008 01:43:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/186578.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/186578.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/186578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/186578.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/186578.html</trackback:ping><description><![CDATA[1.1.2什么是爪哇dmk ？ <br />
爪哇dmk是基于Java的API ，其中包括其所有类与接口对象，开发工具，加快开发进程，并制定一套完整的文件。爪哇dmk是一个兼容执行下列规格： <br />
<br />
该JMX的规格<br />
<br />
该JMX的远程API规范<br />
<br />
该方案构成的Java dmk包括以下内容。 <br />
<br />
新的标准通信模块-5 .1版的J avad mk定义的A PI访问J MX的代理商遥。这个版本包括了新的标准通信模块，基于RMI和jmxmp议定书的规定，界定了JMX的远程API规范。该jmxmp连接器是一个定制的连接器已经创造的，尤其是对JMX的远程API了。 jmxmp是基于Java的系列化超过传输控制协议（ TCP ）连接。 <br />
<br />
RMI技术，超文本传输协议（ HTTP ）和安全的HTTP （ HTTPS的）通讯模块。你仍然可以使用原有的通讯模块的基础上的RMI ， HTTP或和HTTPS协议包括在以前版本的产品。这些遗留通信模块废弃了在Java dmk 5.1 。 <br />
<br />
的HTML适配器。爪哇dmk包括一个HTML适配器，它支持在获得代理人从一个网页浏览器。 <br />
<br />
代理服务。图书馆提供的服务包括监测，调度，动态加载，界定关系，新的和原有系统，为连锁代理层次的，动态的代理发现和部件，为实施安全机制。 <br />
<br />
SNMP的空气污染指数。应用程序依赖于SNMP的短片能够融入现有的网络管理系统，可以帮助这些系统迁移迈向一个更加充满活力，以服务业为主的做法，以网络化管理。 <br />
<br />
SNMPv3的遵守情况。爪哇dmk 5.1提供了一个实施的SNMPv3的安全，以保护您的系统不受外界干扰。 <br />
<br />
安全机制。爪哇dmk 5.1让你选择级别的安全要求。举例来说，一个RMI的连接器超过jrmp ，你可以用一个RMI的插座厂，使这方面的客户机与服务器之间使用安全套接字层（ SSL ） 。一个更先进的安全水平，可与标准jmxmp连接器，它是基于Java安全套接字扩展（ jsse ） ， Java认证和授权服务（ JAAS的） ，以及简单的认证和安全层（ sasl ） 。 <br />
<br />
开发工具，是实施两个独立的应用程序： <br />
<br />
mibgen -这个工具是用来当发展中国家的S NMP代理。一个管理信息库（ MIB ） ，代表了管理界面的资源在一个SNMP代理，并mibgen产生相应的Java对象。 <br />
<br />
proxygen -这个工具是一个代理对象发电机使用与原有接头。该proxygen工具简化了开发的Java技术为基础的管理应用。代理对象，使通信层透明的经理申请。注意，如果您需要委托书标准连接器，你应该使用动态代理人所提供的J2SE （ java.lang.reflect.proxy ） ，而不是proxygen工具。该proxygen工具，是已废弃在Java dmk 5.1 。 <br />
<br />
最后， Java的dmk包括完整的文件，为开发者： <br />
<br />
充分说明各阶层，接口和方法，在播放宣传片，所产生的Javadoc效用。 <br />
<br />
源代码编程的例子，这表明各方面的功能的Java dmk 。 <br />
<br />
教程解释了编程实例和一个参考指南，为独立的工具。 <br />
<br />
在线HTML和PDF档案格式的所有文件。 HTML格式，形成了符合无障碍标准，为电子商务和信息技术所涵盖的第508节的康复法修正案于1998年。<img src ="http://www.blogjava.net/tingfeng/aggbug/186578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2008-03-16 09:43 <a href="http://www.blogjava.net/tingfeng/articles/186578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>