﻿<?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-feu yeux</title><link>http://www.blogjava.net/feuyeux/</link><description>Belong to Eric Han</description><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 18:55:05 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 18:55:05 GMT</pubDate><ttl>60</ttl><item><title>Java中并发环境中的For和ForEach</title><link>http://www.blogjava.net/feuyeux/archive/2012/09/05/387088.html</link><dc:creator>Lu Han</dc:creator><author>Lu Han</author><pubDate>Wed, 05 Sep 2012 06:09:00 GMT</pubDate><guid>http://www.blogjava.net/feuyeux/archive/2012/09/05/387088.html</guid><wfw:comment>http://www.blogjava.net/feuyeux/comments/387088.html</wfw:comment><comments>http://www.blogjava.net/feuyeux/archive/2012/09/05/387088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feuyeux/comments/commentRss/387088.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feuyeux/services/trackbacks/387088.html</trackback:ping><description><![CDATA[<div>package creative.air.datastructure.array;</div><div></div><div>import java.util.ArrayList;</div><div>import java.util.concurrent.CountDownLatch;</div><div>import java.util.logging.Level;</div><div>import java.util.logging.Logger;</div><div></div><div>public class IterateList {</div><div>&nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; static final Logger logger = Logger.getLogger(IterateList.class.getName());</div><div>&nbsp; &nbsp; static ArrayList&lt;Integer&gt; list = new ArrayList&lt;Integer&gt;();</div><div>&nbsp; &nbsp; static final CountDownLatch gateLatch1 = new CountDownLatch(1);</div><div>&nbsp; &nbsp; static final CountDownLatch gateLatch2 = new CountDownLatch(1);</div><div>&nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; public void addMock() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; int top = 0;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; while (top &lt; 20) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list.add(top++);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; public void iterating1() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; try {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //java.lang.IndexOutOfBoundsException:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //for (int i = 0, len =list.size(); i &lt; len; i++) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i &lt; list.size(); i++) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (i == 3) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; gateLatch1.countDown();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.log(Level.INFO, "i={0} list({1})='{'{2}'}'", new Object[]{i, i, list.get(i)});</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; } catch (Exception e) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.log(Level.SEVERE, null, e);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; public void iterating2() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; try {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int i = 0;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //java.util.ConcurrentModificationException:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int n : list) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (i == 3) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; gateLatch2.countDown();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.log(Level.INFO, "i={0} list({1})='{'{2}'}'", new Object[]{i, i, n});</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i++;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; } catch (Exception e) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.log(Level.SEVERE, null, e);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; public static void main(String[] ss) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; IterateList test = new IterateList();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; Thread remover1 = new Thread(new Runnable() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void run() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; gateLatch1.await();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (InterruptedException ex) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.log(Level.SEVERE, null, ex);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!list.isEmpty()) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list.remove(0);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.log(Level.INFO, "list size:{0}", list.size());</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; });</div><div>&nbsp; &nbsp; &nbsp; &nbsp; Thread remover2 = new Thread(new Runnable() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void run() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; gateLatch2.await();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (InterruptedException ex) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.log(Level.SEVERE, null, ex);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!list.isEmpty()) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list.remove(0);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.log(Level.INFO, "list size:{0}", list.size());</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; });</div><div>&nbsp; &nbsp; &nbsp; &nbsp; remover1.start();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; remover2.start();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; test.addMock();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; test.iterating1();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; test.iterating2();</div><div>&nbsp; &nbsp; }</div><div>}</div><img src ="http://www.blogjava.net/feuyeux/aggbug/387088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feuyeux/" target="_blank">Lu Han</a> 2012-09-05 14:09 <a href="http://www.blogjava.net/feuyeux/archive/2012/09/05/387088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>事务简述</title><link>http://www.blogjava.net/feuyeux/archive/2012/04/25/376547.html</link><dc:creator>Lu Han</dc:creator><author>Lu Han</author><pubDate>Wed, 25 Apr 2012 02:45:00 GMT</pubDate><guid>http://www.blogjava.net/feuyeux/archive/2012/04/25/376547.html</guid><wfw:comment>http://www.blogjava.net/feuyeux/comments/376547.html</wfw:comment><comments>http://www.blogjava.net/feuyeux/archive/2012/04/25/376547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feuyeux/comments/commentRss/376547.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feuyeux/services/trackbacks/376547.html</trackback:ping><description><![CDATA[ACID<br /><span style="font-size:10.5pt;line-height:115%; font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;Times New Roman&quot;;">atomicity&nbsp;</span>[,&#230;tə'misəti]&nbsp;<span style="font-family: 微软雅黑, sans-serif; line-height: 16px; ">原子性</span>&nbsp;<br /><span style="font-size:10.5pt;line-height:115%; font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;Times New Roman&quot;;">consistency&nbsp;</span>[kən'sistənsi]&nbsp;&nbsp;<span style="font-family: 微软雅黑, sans-serif; line-height: 16px; ">一致性</span>&nbsp;<br /><span style="font-size:10.5pt;line-height:115%; font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;Times New Roman&quot;;">isolation&nbsp;</span>['aisə'leiʃən]&nbsp;<span style="font-family: 微软雅黑, sans-serif; line-height: 16px; ">隔离性</span>&nbsp;<br /><span style="font-size:10.5pt;line-height:115%; font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;Times New Roman&quot;;">durability</span>
[,djuərə'biləti]&nbsp;<span style="font-family: 微软雅黑, sans-serif; line-height: 16px; ">持久性<br /><br />InnoDB<br />QPS Question Per Second<br />TPS Transaction Per Second=(com_commit+com_rollback)/time<br /><br /></span><table class="MsoNormalTable" border="0" cellpadding="0" width="500" style="width: 500px; " bordercolor="" cellspacing="">
 <tbody><tr>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:宋体">隔离级别<span lang="EN-US"><o:p></o:p></span></span></p>
  </td>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:宋体">更新丢失<span lang="EN-US"><o:p></o:p></span></span></p>
  </td>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:宋体">脏读取<span lang="EN-US"><o:p></o:p></span></span></p>
  </td>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:宋体">重复读取<span lang="EN-US"><o:p></o:p></span></span></p>
  </td>
  <td style="padding-top: 1.5pt; padding-right: 1.5pt; padding-bottom: 1.5pt; padding-left: 1.5pt; " rowspan="1">&nbsp;</td><td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:宋体">幻读<span lang="EN-US"><o:p></o:p></span></span></p>
  </td>
 </tr>
 <tr style="border-image: initial; ">
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:宋体">未授权读取</span><span lang="EN-US" style="color:red">READ-UNCOMMITTED</span><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;"><o:p></o:p></span></p>
  </td>
  <td style="padding-top: 1.5pt; padding-right: 1.5pt; padding-bottom: 1.5pt; padding-left: 1.5pt; border-image: initial; ">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; border-image: initial; "><span lang="EN-US" style="font-size: 10.5pt; font-family: 微软雅黑, sans-serif; border-image: initial; ">N<o:p></o:p></span></p>
  </td>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;">Y<o:p></o:p></span></p>
  </td>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;">Y<o:p></o:p></span></p>
  </td>
  <td style="padding-top: 1.5pt; padding-right: 1.5pt; padding-bottom: 1.5pt; padding-left: 1.5pt; " rowspan="1">&nbsp;</td><td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span lang="EN-US" style="font-size: 10.5pt; font-family: 微软雅黑, sans-serif; ">Y<o:p></o:p></span></p>
  </td>
 </tr>
 <tr>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:宋体;background:yellow;mso-highlight:yellow">授权读取</span><span lang="EN-US" style="color:red;background:yellow;mso-highlight:yellow">READ-COMMITTED</span><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;;background:yellow;mso-highlight:yellow"><o:p></o:p></span></p>
  </td>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;;background:yellow;mso-highlight:yellow">N<o:p></o:p></span></p>
  </td>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;;background:yellow;mso-highlight:yellow">N<o:p></o:p></span></p>
  </td>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;;background:yellow;mso-highlight:yellow">Y<o:p></o:p></span></p>
  </td>
  <td style="padding-top: 1.5pt; padding-right: 1.5pt; padding-bottom: 1.5pt; padding-left: 1.5pt; " rowspan="1">&nbsp;</td><td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;;background:yellow;mso-highlight:yellow">Y<o:p></o:p></span></p>
  </td>
 </tr>
 <tr>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:宋体">可重复读取</span><span lang="EN-US" style="color:red">REPEATABLE-READ</span><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;"><o:p></o:p></span></p>
  </td>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;">N<o:p></o:p></span></p>
  </td>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;">N<o:p></o:p></span></p>
  </td>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;">N<o:p></o:p></span></p>
  </td>
  <td style="padding-top: 1.5pt; padding-right: 1.5pt; padding-bottom: 1.5pt; padding-left: 1.5pt; " rowspan="1">&nbsp;</td><td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;">Y<o:p></o:p></span></p>
  </td>
 </tr>
 <tr>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:宋体">串行</span><span lang="EN-US" style="color:red">SERIALIZABLE</span><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;"><o:p></o:p></span></p>
  </td>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;">N<o:p></o:p></span></p>
  </td>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;">N<o:p></o:p></span></p>
  </td>
  <td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;">N<o:p></o:p></span></p>
  </td>
  <td style="padding-top: 1.5pt; padding-right: 1.5pt; padding-bottom: 1.5pt; padding-left: 1.5pt; " rowspan="1">&nbsp;</td><td style="padding:1.5pt 1.5pt 1.5pt 1.5pt">
  <p class="MsoNormal" style="margin-bottom: 0.0001pt; "><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;
  mso-bidi-font-family:&quot;Times New Roman&quot;">N<o:p></o:p></span></p>
  </td>
 </tr>
</tbody></table><table border="0" cellspacing="2" cellpadding="2" width="500"><tbody><tr><td> </td><td> </td><td> </td><td> </td></tr><tr><td> </td><td> </td><td> </td><td> </td></tr><tr><td> </td><td> </td><td> </td><td> </td></tr></tbody></table><br /><div><span style="line-height: 16px;">数据库并发操作存在的异常情况：</span></div><div><span style="line-height: 16px;">1.更新丢失（LostUpdate）：</span></div><div><span style="line-height: 16px;">A和B事务并发执行，A事务执行更新后，提交；B事务在A事务更新后，B事务结束前也做了对该行数据的更新操作，然后回滚，则两次更新操作都丢失了。</span></div><div><span style="line-height: 16px;"><br /></span></div><div><span style="line-height: 16px;">第一类丢失更新(回滚丢失，Lost update)。</span></div><div><span style="line-height: 16px;">在事务A期间，事务B对数据进行了更新；在事务A撤销之后，覆盖了事务B已经提交的数据。</span></div><div><span style="line-height: 16px;">SQL92没有定义这种现象，标准定义的所有隔离界别都不允许第一类丢失更新发生。</span></div><div><span style="line-height: 16px;"><br /></span></div><div><span style="line-height: 16px;">第二类丢失更新(覆盖丢失/两次更新问题，Second lost update)。</span></div><div><span style="line-height: 16px;">在事务A期间，事务B对数据进行了更新；在事务A提交之后，覆盖了事务B已经提交的数据。</span></div><div><span style="line-height: 16px;">第二类丢失更新，实际上和不可重复读是同一种问题。</span></div><div><span style="line-height: 16px;"><br /></span></div><div><span style="line-height: 16px;">2.脏读取（DirtyReads）：</span></div><div><span style="line-height: 16px;">A和B事务并发执行，B事务执行更新后，A事务查询B事务没有提交的数据，B事务回滚，则A事务得到的数据不是数据库中的真实数据。也就是脏数据，即和数据库中不一致的数据。</span></div><div><span style="line-height: 16px;"><br /></span></div><div><span style="line-height: 16px;">3.不可重复读取（Non-repeatableReads）：</span></div><div><span style="line-height: 16px;">&nbsp;A和B事务并发执行，A事务查询数据，然后B事务更新该数据并提交，A再次查询该数据时，发现该数据变化了。</span></div><div><span style="line-height: 16px;"><br /></span></div><div><span style="line-height: 16px;">4.幻读（PhantomReads）：也称为幻像（幻影）。</span></div><div><span style="line-height: 16px;">A和B事务并发执行，A事务查询数据，B事务插入或者删除数据并提交，A事务再次查询发现,结果集中,有以前没有的数据或者以前有的数据消失了。<br /></span><br /><p style="margin-bottom:0cm;margin-bottom:.0001pt;line-height: 150%"><span style="font-size:10.5pt;line-height:150%;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;Times New Roman&quot;">为了避免上面出现几种情况在标准SQL规范中定义了4个事务隔离级别，不同隔离级别对事务处理不同。</span></p><div><span style="line-height: 16px;">1. READ-UNCOMMITTED未授权读取/未提交读</span></div><div><span style="line-height: 16px;">允许脏读取但不允许更新丢失。</span></div><div><span style="line-height: 16px;">如果一个事务已经开始写数据，则另外一个事务不允许同时进行写操作，但允许其他事务读此行数据。通过&#8220;排他写锁&#8221;实现。</span></div><div><span style="line-height: 16px;"><br /></span></div><div><span style="line-height: 16px;">2. READ-COMMITTED授权读取/提交读</span></div><div><span style="line-height: 16px;">允许不可重复读取但不允许脏读取。</span></div><div><span style="line-height: 16px;">更新语句提交以后别的事务才能读到这个改变。读取数据的事务允许其他事务继续访问该行数据，但是未提交的写事务将会禁止其他事务访问该行。通过&#8220;瞬间共享读锁&#8221;和&#8220;排他写锁&#8221;实现，</span></div><div><span style="line-height: 16px;">在此隔离级下，SELECT命令不会返回尚未提交（Committed）的数据，也不能返回脏数据。</span></div><div><span style="line-height: 16px;"><br /></span></div><div><span style="line-height: 16px;">3. REPEATABLE-READ可重复读取</span></div><div><span style="line-height: 16px;">禁止不可重复读取和脏读取。但是有时可能出现幻影数据</span></div><div><span style="line-height: 16px;">在同一个事务里面先后执行同一个查询语句的时候，确保得到的结果是一样的。读取数据的事务将会禁止写事务（但允许读事务），写事务则禁止任何其他事务。通过&#8220;共享读锁&#8221;和&#8220;排他写锁&#8221;实现，</span></div><div><span style="line-height: 16px;">在此隔离级下，用SELECT命令读取的数据在整个命令执行过程中不会被更改。此选项会影响系统的效能，非必要情况最好不用此隔离级。</span></div><div><span style="line-height: 16px;"><br /></span></div><div><span style="line-height: 16px;">4. SERIALIZABLE串行/可串行读。</span></div><div><span style="line-height: 16px;">事务只能一个接着一个地执行，但不能并发执行。如果仅仅通过&#8220;行级锁&#8221;是无法实现事务序列化的，必须通过其他机制保证新插入的数据不会被刚执行查询操作事务访问到。</span></div><div style="line-height: 16px; "></div></div><div style="font-family: 微软雅黑, sans-serif; line-height: 16px; "></div><img src ="http://www.blogjava.net/feuyeux/aggbug/376547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feuyeux/" target="_blank">Lu Han</a> 2012-04-25 10:45 <a href="http://www.blogjava.net/feuyeux/archive/2012/04/25/376547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java安全传输实践2</title><link>http://www.blogjava.net/feuyeux/archive/2011/11/05/362724.html</link><dc:creator>Lu Han</dc:creator><author>Lu Han</author><pubDate>Fri, 04 Nov 2011 20:27:00 GMT</pubDate><guid>http://www.blogjava.net/feuyeux/archive/2011/11/05/362724.html</guid><wfw:comment>http://www.blogjava.net/feuyeux/comments/362724.html</wfw:comment><comments>http://www.blogjava.net/feuyeux/archive/2011/11/05/362724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feuyeux/comments/commentRss/362724.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feuyeux/services/trackbacks/362724.html</trackback:ping><description><![CDATA[<div><div><div><div><strong>证书概述：</strong><br />ICM服务器证书 由中间CA签发 中间CA由CA签发<br />UCGW客户端证书 由中间CA签发 中间CA由CA签发<br /><br /><strong>证书签发过程：</strong><br />创建ICM自签证书</div><div>keytool -genkey -dname "CN=mars_icm, OU=rv, O=rcd, L=ZB, ST=bj, C=China" -alias icm -keyalg RSA -keystore temp/iview.keystore -keypass 111111 -storepass 111111 -validity 60</div><div>keytool -certreq -alias icm -keypass 111111 -file "temp/icm.self.csr" -keystore "temp/iview.keystore" -storepass 111111</div><div>keytool -export -alias icm -keystore temp/iview.keystore -storepass 111111 -rfc -file temp/icm.self.cer</div><div>创建UCGW自签证书</div><div>keytool -genkey -dname "CN=mars_UCGW, OU=rv, O=rcd, L=ZB, ST=bj, C=China" -alias ucgw -keyalg RSA -keystore temp/ucgw.keystore -keypass 111111 -storepass 111111 -validity 60</div><div>keytool -certreq -alias ucgw -keypass 111111 -file "temp/ucgw.self.csr" -keystore "temp/ucgw.keystore" -storepass 111111</div><div>keytool -export -alias ucgw -keystore temp/ucgw.keystore -storepass 111111 -rfc -file temp/ucgw.self.cer</div><div>创建中间CA自签证书</div><div>keytool -genkey -dname "CN=mars_inter, OU=rv, O=rcd, L=ZB, ST=bj, C=China" -alias intermediary -keyalg RSA -keystore temp/inter.keystore -keypass 111111 -storepass 111111 -validity 60</div><div>keytool -certreq -alias intermediary -keypass 111111 -file "temp/inter.self.csr" -keystore "temp/inter.keystore" -storepass 111111</div><div>keytool -export -alias intermediary -keystore temp/inter.keystore -storepass 111111 -rfc -file temp/inter.self.cer</div><div>创建CA证书</div><div>keytool -genkey -dname "CN=mars_ca, OU=rv, O=rcd, L=ZB, ST=bj, C=China" -alias root -keyalg RSA -keystore temp/ca--ca.keystore -keypass 111111 -storepass 111111 -validity 60</div><div>keytool -certreq -alias root -keypass 111111 -file "temp/root.csr" -keystore "temp/ca--ca.keystore" -storepass 111111</div><div>keytool -export -alias root -keystore temp/ca--ca.keystore -storepass 111111 -rfc -file temp/root.cer</div><div>CA签发中间CA证书</div><div>keytool -export -alias ca_signed -keystore temp/ca--ca_sign.keystore -storepass 111111 -rfc -file temp/inter.cer</div><div>验证中间CA证书</div><div>It is signed by the CA</div><div>导入中间CA的KeyStore</div><div>keytool -importcert -noprompt -trustcacerts -alias root -file temp/root.cer -keystore temp/inter.keystore -storepass 111111 -keypass 111111</div><div>keytool -importcert -noprompt -alias intermediary -file temp/inter.cer -keystore temp/inter.keystore -storepass 111111</div><div>中间CA签发icm证书</div><div>keytool -export -alias inter_signed -keystore temp/ca--ca_sign.keystore -storepass 111111 -rfc -file temp/icm.signed.cer</div><div>中间CA签发ucgw证书</div><div>keytool -export -alias inter_signed -keystore temp/ca--ca_sign.keystore -storepass 111111 -rfc -file temp/ucgw.signed.cer</div><div>验证ICM证书</div><div>It is signed by the CA</div><div>验证UCGW证书</div><div>It is signed by the CA</div><div>导入ICM的KeyStore</div><div>keytool -importcert -noprompt -trustcacerts -alias root -file temp/root.cer -keystore temp/iview.keystore -storepass 111111 -keypass 111111</div><div>keytool -importcert -noprompt -trustcacerts -alias intermediary -file temp/inter.cer -keystore temp/iview.keystore -storepass 111111 -keypass 111111</div><div>keytool -importcert -noprompt -alias icm -file temp/icm.signed.cer -keystore temp/iview.keystore -storepass 111111</div><div>导入UCGW的KeyStore</div><div>keytool -importcert -noprompt -trustcacerts -alias root -file temp/root.cer -keystore temp/ucgw.keystore -storepass 111111 -keypass 111111</div><div>keytool -importcert -noprompt -trustcacerts -alias intermediary -file temp/inter.cer -keystore temp/ucgw.keystore -storepass 111111 -keypass 111111</div><div>keytool -importcert -noprompt -alias ucgw -file temp/ucgw.signed.cer -keystore temp/ucgw.keystore -storepass 111111</div><div>---------------------------------------------------------------</div><div>keytool -list -keystore temp/ca--ca.keystore -storepass 111111</div><div>...</div><div>root, 2011-11-5, PrivateKeyEntry,&nbsp;</div><div>认证指纹 (MD5)： 49:44:8A:79:3C:62:ED:66:AA:20:D6:BF:65:3E:23:C4</div><div>---------------------------------------------------------------</div><div>keytool -list -keystore temp/inter.keystore -storepass 111111</div><div>...</div><div>root, 2011-11-5, trustedCertEntry,</div><div>认证指纹 (MD5)： 49:44:8A:79:3C:62:ED:66:AA:20:D6:BF:65:3E:23:C4</div><div>intermediary, 2011-11-5, PrivateKeyEntry,&nbsp;</div><div>认证指纹 (MD5)： 23:6C:C0:46:67:CF:9E:4E:EF:A9:74:95:AB:EE:37:21</div><div>---------------------------------------------------------------</div><div>keytool -list -v -keystore temp/iview.keystore -storepass 111111</div><div>...</div><div>您的 keystore 包含 3 输入</div><div></div><div>别名名称： root</div><div>创建日期： 2011-11-5</div><div>输入类型： trustedCertEntry</div><div></div><div>所有者:CN=mars_ca, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>签发人:CN=mars_ca, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>序列号:4eb449c5</div><div>有效期: Sat Nov 05 04:23:33 CST 2011 至Wed Jan 04 04:23:33 CST 2012</div><div>证书指纹:</div><div><span style="white-space:pre">	</span> MD5:49:44:8A:79:3C:62:ED:66:AA:20:D6:BF:65:3E:23:C4</div><div><span style="white-space:pre">	</span> SHA1:EA:92:AE:59:D1:8D:B6:2F:33:B7:65:CC:6E:B0:B5:7D:40:CF:45:BE</div><div><span style="white-space:pre">	</span> 签名算法名称:SHA1withRSA</div><div><span style="white-space:pre">	</span> 版本: 3</div><div></div><div>*******************************************</div><div>*******************************************</div><div>别名名称： intermediary</div><div>创建日期： 2011-11-5</div><div>输入类型： trustedCertEntry</div><div></div><div>所有者:CN=mars_inter, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>签发人:CN=mars_ca, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>序列号:4eb449c7</div><div>有效期: Sat Nov 05 04:23:35 CST 2011 至Wed Jan 22 04:23:35 CST 2020</div><div>证书指纹:</div><div><span style="white-space:pre">	</span> MD5:23:6C:C0:46:67:CF:9E:4E:EF:A9:74:95:AB:EE:37:21</div><div><span style="white-space:pre">	</span> SHA1:54:86:85:BC:9C:D5:D2:E8:A4:E6:33:DD:4F:42:87:FB:2A:92:F3:84</div><div><span style="white-space:pre">	</span> 签名算法名称:MD5withRSA</div><div><span style="white-space:pre">	</span> 版本: 3</div><div></div><div>*******************************************</div><div>*******************************************</div><div>别名名称： icm</div><div>创建日期： 2011-11-5</div><div>项类型: PrivateKeyEntry</div><div>认证链长度： 3</div><div>认证 [1]:</div><div>所有者:CN=mars_icm, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>签发人:CN=mars_inter, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>序列号:4eb449ca</div><div>有效期: Sat Nov 05 04:23:38 CST 2011 至Wed Jan 22 04:23:38 CST 2020</div><div>证书指纹:</div><div><span style="white-space:pre">	</span> MD5:95:97:C3:2C:2C:A5:B4:7A:17:EF:98:B7:7B:BC:AE:4A</div><div><span style="white-space:pre">	</span> SHA1:E1:92:F9:79:48:FE:59:AF:3F:85:CE:2A:21:82:AD:B2:00:60:EB:D7</div><div><span style="white-space:pre">	</span> 签名算法名称:MD5withRSA</div><div><span style="white-space:pre">	</span> 版本: 3</div><div>认证 [2]:</div><div>所有者:CN=mars_inter, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>签发人:CN=mars_ca, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>序列号:4eb449c7</div><div>有效期: Sat Nov 05 04:23:35 CST 2011 至Wed Jan 22 04:23:35 CST 2020</div><div>证书指纹:</div><div><span style="white-space:pre">	</span> MD5:23:6C:C0:46:67:CF:9E:4E:EF:A9:74:95:AB:EE:37:21</div><div><span style="white-space:pre">	</span> SHA1:54:86:85:BC:9C:D5:D2:E8:A4:E6:33:DD:4F:42:87:FB:2A:92:F3:84</div><div><span style="white-space:pre">	</span> 签名算法名称:MD5withRSA</div><div><span style="white-space:pre">	</span> 版本: 3</div><div>认证 [3]:</div><div>所有者:CN=mars_ca, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>签发人:CN=mars_ca, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>序列号:4eb449c5</div><div>有效期: Sat Nov 05 04:23:33 CST 2011 至Wed Jan 04 04:23:33 CST 2012</div><div>证书指纹:</div><div><span style="white-space:pre">	</span> MD5:49:44:8A:79:3C:62:ED:66:AA:20:D6:BF:65:3E:23:C4</div><div><span style="white-space:pre">	</span> SHA1:EA:92:AE:59:D1:8D:B6:2F:33:B7:65:CC:6E:B0:B5:7D:40:CF:45:BE</div><div><span style="white-space:pre">	</span> 签名算法名称:SHA1withRSA</div><div><span style="white-space:pre">	</span> 版本: 3</div><div>---------------------------------------------------------------</div><div>keytool -list -v -keystore temp/ucgw.keystore -storepass 111111</div><div>...</div><div>您的 keystore 包含 3 输入</div><div></div><div>别名名称： root</div><div>创建日期： 2011-11-5</div><div>输入类型： trustedCertEntry</div><div></div><div>所有者:CN=mars_ca, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>签发人:CN=mars_ca, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>序列号:4eb449c5</div><div>有效期: Sat Nov 05 04:23:33 CST 2011 至Wed Jan 04 04:23:33 CST 2012</div><div>证书指纹:</div><div><span style="white-space:pre">	</span> MD5:49:44:8A:79:3C:62:ED:66:AA:20:D6:BF:65:3E:23:C4</div><div><span style="white-space:pre">	</span> SHA1:EA:92:AE:59:D1:8D:B6:2F:33:B7:65:CC:6E:B0:B5:7D:40:CF:45:BE</div><div><span style="white-space:pre">	</span> 签名算法名称:SHA1withRSA</div><div><span style="white-space:pre">	</span> 版本: 3</div><div></div><div>*******************************************</div><div>*******************************************</div><div>别名名称： intermediary</div><div>创建日期： 2011-11-5</div><div>输入类型： trustedCertEntry</div><div></div><div>所有者:CN=mars_inter, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>签发人:CN=mars_ca, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>序列号:4eb449c7</div><div>有效期: Sat Nov 05 04:23:35 CST 2011 至Wed Jan 22 04:23:35 CST 2020</div><div>证书指纹:</div><div><span style="white-space:pre">	</span> MD5:23:6C:C0:46:67:CF:9E:4E:EF:A9:74:95:AB:EE:37:21</div><div><span style="white-space:pre">	</span> SHA1:54:86:85:BC:9C:D5:D2:E8:A4:E6:33:DD:4F:42:87:FB:2A:92:F3:84</div><div><span style="white-space:pre">	</span> 签名算法名称:MD5withRSA</div><div><span style="white-space:pre">	</span> 版本: 3</div><div></div><div>*******************************************</div><div>*******************************************</div><div>别名名称： ucgw</div><div>创建日期： 2011-11-5</div><div>项类型: PrivateKeyEntry</div><div>认证链长度： 3</div><div>认证 [1]:</div><div>所有者:CN=mars_UCGW, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>签发人:CN=mars_inter, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>序列号:4eb449cb</div><div>有效期: Sat Nov 05 04:23:39 CST 2011 至Wed Jan 22 04:23:39 CST 2020</div><div>证书指纹:</div><div><span style="white-space:pre">	</span> MD5:D7:6D:ED:9C:13:B6:79:D2:4C:B1:B7:57:CE:AA:BB:54</div><div><span style="white-space:pre">	</span> SHA1:C0:AD:FC:86:53:CB:4F:92:D6:6C:2E:23:25:8F:EF:89:7D:8D:3A:EB</div><div><span style="white-space:pre">	</span> 签名算法名称:MD5withRSA</div><div><span style="white-space:pre">	</span> 版本: 3</div><div>认证 [2]:</div><div>所有者:CN=mars_inter, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>签发人:CN=mars_ca, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>序列号:4eb449c7</div><div>有效期: Sat Nov 05 04:23:35 CST 2011 至Wed Jan 22 04:23:35 CST 2020</div><div>证书指纹:</div><div><span style="white-space:pre">	</span> MD5:23:6C:C0:46:67:CF:9E:4E:EF:A9:74:95:AB:EE:37:21</div><div><span style="white-space:pre">	</span> SHA1:54:86:85:BC:9C:D5:D2:E8:A4:E6:33:DD:4F:42:87:FB:2A:92:F3:84</div><div><span style="white-space:pre">	</span> 签名算法名称:MD5withRSA</div><div><span style="white-space:pre">	</span> 版本: 3</div><div>认证 [3]:</div><div>所有者:CN=mars_ca, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>签发人:CN=mars_ca, OU=rv, O=rcd, L=ZB, ST=bj, C=China</div><div>序列号:4eb449c5</div><div>有效期: Sat Nov 05 04:23:33 CST 2011 至Wed Jan 04 04:23:33 CST 2012</div><div>证书指纹:</div><div><span style="white-space:pre">	</span> MD5:49:44:8A:79:3C:62:ED:66:AA:20:D6:BF:65:3E:23:C4</div><div><span style="white-space:pre">	</span> SHA1:EA:92:AE:59:D1:8D:B6:2F:33:B7:65:CC:6E:B0:B5:7D:40:CF:45:BE</div><div><span style="white-space:pre">	</span> 签名算法名称:SHA1withRSA</div><div><span style="white-space:pre">	</span> 版本: 3<br /><br /><strong>双向认证TLS网络包：<br /></strong>filter:<br />tcp.port==9527&amp;&amp;ssl<br /><div><div><br />route add &lt;your_IP&gt; mask 255.255.255.255 &lt;the_gateway&gt; metric 1</div><div>route delete &lt;your_IP&gt;<br /><div>route add&nbsp;192.168.0.100 mask&nbsp;<div style="display: inline-block; "></div>255.255.255.255&nbsp;192.168.0.1&nbsp;<div style="display: inline-block; "></div>metric 1<br /><div>route delete 192.168.0.100</div><div><div>1： 54292[client]<span style="white-space:pre">	</span>9527[server]<span style="white-space:pre">	</span>TLSv1<span style="white-space:pre">	</span><span style="color: #3366ff; ">Client Hello</span></div><div>2，3，4，5： 9527[server]<span style="white-space:pre">	</span>54292[client]<span style="white-space:pre">	</span>TLSv1<span style="white-space:pre">	</span><span style="color: red; ">Server Hello, Certificate, Server Key Exchange, Certificate Request, Server Hello Done</span></div><div>6，7： 54292[client]<span style="white-space:pre">	</span>9527[server]<span style="white-space:pre">	</span>TLSv1<span style="white-space:pre">	</span><span style="color: #3366ff; ">Certificate, Client Key Exchange</span></div><div>8： 54292[client]<span style="white-space:pre">	</span>9527[server]<span style="white-space:pre">	</span>TLSv1<span style="white-space:pre">	</span><span style="color: #3366ff; ">Certificate Verify</span></div><div>9，10： 54292[client]<span style="white-space:pre">	</span>9527[server]<span style="white-space:pre">	</span>TLSv1<span style="white-space:pre">	</span><span style="color: #3366ff; ">Change Cipher Spec, Encrypted Handshake Message</span></div><div>11，12： 9527[server]<span style="white-space:pre">	</span>54292[client]<span style="white-space:pre">	</span>TLSv1<span style="white-space:pre">	</span><span style="color: #ff0000; ">Change Cipher Spec (Finished)</span></div><div>9527[server]<span style="white-space:pre">	</span>54292[client]<span style="white-space:pre">	</span>TLSv1<span style="white-space:pre">	</span><span>Encrypted Handshake Message, Application Data, Application Data, Encrypted Alert</span><br /><br /><br />双向认证流程：<br /><img src="http://www.blogjava.net/images/blogjava_net/feuyeux/0.png" border="0" alt="" width="519" height="558" /></div></div></div></div></div></div></div></div></div><img src ="http://www.blogjava.net/feuyeux/aggbug/362724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feuyeux/" target="_blank">Lu Han</a> 2011-11-05 04:27 <a href="http://www.blogjava.net/feuyeux/archive/2011/11/05/362724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>轮询客户端的实现</title><link>http://www.blogjava.net/feuyeux/archive/2011/07/08/353948.html</link><dc:creator>Lu Han</dc:creator><author>Lu Han</author><pubDate>Fri, 08 Jul 2011 08:01:00 GMT</pubDate><guid>http://www.blogjava.net/feuyeux/archive/2011/07/08/353948.html</guid><wfw:comment>http://www.blogjava.net/feuyeux/comments/353948.html</wfw:comment><comments>http://www.blogjava.net/feuyeux/archive/2011/07/08/353948.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/feuyeux/comments/commentRss/353948.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feuyeux/services/trackbacks/353948.html</trackback:ping><description><![CDATA[<div style="color: #000000; font-family: Verdana, Arial, Helvetica, sans-serif; margin-top: 8px; margin-right: 8px; margin-bottom: 8px; margin-left: 8px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; line-height: normal; background-color: #ffffff; "><div><span style="font-size: 10pt; "><strong>Scenario</strong></span><br /><span style="font-size: 10pt; ">服务器1:客户端n&nbsp;</span><span style="font-size: 10pt; ">发送Notification给客户端的</span><span style="font-size: 13px; ">后</span><span style="font-size: 10pt; ">处理</span><br /><span style="font-size: 10pt; ">服务器端给第一个客户端发送notification，然后在限定时间内，等待客户端作出回应&#8212;向服务器发送request。如果客户端一直没有回复，服务器会在到达限定时间后，向第二个客户端发送notification。如果客户端在限定时间内回复，服务器端放弃再给其他客户端发送消息。</span><br /><br /><span style="font-size: 10pt; "><strong>Design</strong></span><br /><span style="font-size: 10pt; ">服务器、客户端使用socket发送和接收信息</span><br /><span style="font-size: 10pt; ">发送端存在一个客户端列表，每次发送一给一个客户端，发送后，向Helper发送添加该客户端id的请求。<br /></span><span style="font-size: 10pt; ">客户端收到信息会向Helper发送删除该id的请求。<br /></span><span style="font-size: 10pt; ">Helper收到add时</span><span style="font-size: 10pt; ">，启动一个</span><span style="font-size: 10pt; ">ScheduledExecuto</span><span style="font-size: 10pt; ">rService类的</span><font size="1"><span style="font-size: 10pt; ">schedule，</span></font><span style="font-size: 10pt; ">延时启动</span><span style="font-size: 10pt; ">一个线程，并将该</span><span style="font-size: 10pt; ">schedule缓存</span><span style="font-size: 10pt; ">。remove时，从缓存里取出</span><span style="font-size: 10pt; ">schedule并停止它。如果在延时时间内，线程没有被停止，它会被执行：从缓存中取出，告诉服务器向下一个客户端发送请求。</span><div style="font-size: 10px; ">&nbsp;<strong style="font-size: 10pt; ">UML</strong></div></div><p style="font-size: 10px; "><span><img src="http://www.blogjava.net/images/blogjava_net/feuyeux/1233333.png" alt="" style="border-top-color: #3366ff; border-right-color: #3366ff; border-bottom-color: #3366ff; border-left-color: #3366ff; " height="538" border="1" width="984" /><br /><br />Code<br /><br /></span></p><div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><img id="Code_Closed_Image_155625" onclick="this.style.display='none'; Code_Closed_Text_155625.style.display='none'; Code_Open_Image_155625.style.display='inline'; Code_Open_Text_155625.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" height="16" align="top" width="11" style="display: none; "><img id="Code_Open_Image_155625" style="display: none" onclick="this.style.display='none'; Code_Open_Text_155625.style.display='none'; Code_Closed_Image_155625.style.display='inline'; Code_Closed_Text_155625.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" height="16" align="top" width="11"><span id="Code_Closed_Text_155625" style="border-right-color: #808080; border-right-width: 1px; border-right-style: solid; border-top-color: #808080; border-top-width: 1px; border-top-style: solid; border-left-color: #808080; border-left-width: 1px; border-left-style: solid; border-bottom-color: #808080; border-bottom-width: 1px; border-bottom-style: solid; background-color: #ffffff; display: none; ">Server</span><span id="Code_Open_Text_155625" style="display: none"><br /><!--<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; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Server&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String&nbsp;id&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">100</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerSocket&nbsp;serverSocket&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ServerSocket(IO.BIO_TCP_PORT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Server&nbsp;is&nbsp;listening&nbsp;on&nbsp;port:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;IO.BIO_TCP_PORT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;socket&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;serverSocket.accept();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accept&nbsp;socket&nbsp;error.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendingNotification&nbsp;sender&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;SendingNotification(id,&nbsp;socket);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sender.start();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReceivingRequest&nbsp;receiver</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ReceivingRequest(socket);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;receiver.start();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span></span></div><br /><div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><img id="Code_Closed_Image_155650" onclick="this.style.display='none'; Code_Closed_Text_155650.style.display='none'; Code_Open_Image_155650.style.display='inline'; Code_Open_Text_155650.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" height="16" align="top" width="11"><img id="Code_Open_Image_155650" style="display: none" onclick="this.style.display='none'; Code_Open_Text_155650.style.display='none'; Code_Closed_Image_155650.style.display='inline'; Code_Closed_Text_155650.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" height="16" align="top" width="11"><span id="Code_Closed_Text_155650" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">SendingNotification</span><span id="Code_Open_Text_155650" style="display: none"><br /><!--<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; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;SendingNotification&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;Thread&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;String&nbsp;id;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;Socket&nbsp;socket;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;SendingNotification(String&nbsp;sdId,&nbsp;Socket&nbsp;socket)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.id&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sdId;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.socket&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;run()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Helper.getInstance().add(id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;outputStream&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">byte</span><span style="color: #000000; ">[]&nbsp;buffer&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">byte</span><span style="color: #000000; ">[</span><span style="color: #000000; ">1024</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputStream&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket.getOutputStream();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(id</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">).getBytes();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputStream.write(buffer);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputStream.flush();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">don't&nbsp;send&nbsp;success</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputStream.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span></span></div><br /><div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><img id="Code_Closed_Image_155758" onclick="this.style.display='none'; Code_Closed_Text_155758.style.display='none'; Code_Open_Image_155758.style.display='inline'; Code_Open_Text_155758.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" height="16" align="top" width="11"><img id="Code_Open_Image_155758" style="display: none" onclick="this.style.display='none'; Code_Open_Text_155758.style.display='none'; Code_Closed_Image_155758.style.display='inline'; Code_Closed_Text_155758.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" height="16" align="top" width="11"><span id="Code_Closed_Text_155758" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">ReceivingRequest</span><span id="Code_Open_Text_155758" style="display: none"><br /><!--<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; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;ReceivingRequest&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;Thread&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;Socket&nbsp;socket;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;ReceivingRequest(Socket&nbsp;socket)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.socket&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;run()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;in;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;finished&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">finished)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;BufferedReader(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;InputStreamReader(socket.getInputStream()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;line&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;in.readLine();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(line&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000; ">100</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Helper.getInstance().remove(line);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finished&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">receive&nbsp;fails&nbsp;to&nbsp;run.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span></span></div><br /><div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><img id="Code_Closed_Image_155826" onclick="this.style.display='none'; Code_Closed_Text_155826.style.display='none'; Code_Open_Image_155826.style.display='inline'; Code_Open_Text_155826.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" height="16" align="top" width="11"><img id="Code_Open_Image_155826" style="display: none" onclick="this.style.display='none'; Code_Open_Text_155826.style.display='none'; Code_Closed_Image_155826.style.display='inline'; Code_Closed_Text_155826.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" height="16" align="top" width="11"><span id="Code_Closed_Text_155826" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">Helper</span><span id="Code_Open_Text_155826" style="display: none"><br /><!--<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; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Helper&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;Helper&nbsp;instance&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Helper();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;ConcurrentHashMap</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;Schedule</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;cache&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ConcurrentHashMap</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;Schedule</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;timeout&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;Helper&nbsp;getInstance()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;instance;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;Schedule&nbsp;addTask(</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String&nbsp;id)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;Schedule&nbsp;schedule&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Schedule();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;schedule.schedule(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Runnable()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;run()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doNext(id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;schedule.shutdown();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;timeout,&nbsp;SECONDS);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;schedule;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;doNext(String&nbsp;id)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Schedule&nbsp;schedule&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cache.remove(id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">time&nbsp;out&nbsp;and&nbsp;do&nbsp;next&nbsp;well.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">total&nbsp;time=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;schedule.getSeconds());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;add(</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String&nbsp;id)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Schedule&nbsp;schedule&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;addTask(id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.put(id,&nbsp;schedule);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Add&nbsp;to&nbsp;cache&nbsp;successfully</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;remove(</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String&nbsp;id)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Schedule&nbsp;schedule&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cache.remove(id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(schedule&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">no&nbsp;schedule&nbsp;exist.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;schedule.shutdown();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Remove&nbsp;to&nbsp;cache&nbsp;successfully</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span></span></div><br /><div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><img id="Code_Closed_Image_160011" onclick="this.style.display='none'; Code_Closed_Text_160011.style.display='none'; Code_Open_Image_160011.style.display='inline'; Code_Open_Text_160011.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" height="16" align="top" width="11"><img id="Code_Open_Image_160011" style="display: none" onclick="this.style.display='none'; Code_Open_Text_160011.style.display='none'; Code_Closed_Image_160011.style.display='inline'; Code_Closed_Text_160011.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" height="16" align="top" width="11"><span id="Code_Closed_Text_160011" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">Schedule</span><span id="Code_Open_Text_160011" style="display: none"><br /><!--<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; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Schedule&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;ScheduledExecutorService&nbsp;excutor;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;startTime;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Schedule()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;excutor&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Executors.newSingleThreadScheduledExecutor();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startTime&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;System.currentTimeMillis();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;getTotalTime()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;endTime&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;System.currentTimeMillis();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;endTime&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;startTime;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;getSeconds()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;s&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;getTotalTime()&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;s&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;seconds</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;schedule(Runnable&nbsp;command,&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;delay,&nbsp;TimeUnit&nbsp;unit)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;excutor.schedule(command,&nbsp;delay,&nbsp;unit);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;shutdown()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;excutor.shutdownNow();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span></span></div><br /><div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><img id="Code_Closed_Image_155847" onclick="this.style.display='none'; Code_Closed_Text_155847.style.display='none'; Code_Open_Image_155847.style.display='inline'; Code_Open_Text_155847.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" height="16" align="top" width="11"><img id="Code_Open_Image_155847" style="display: none" onclick="this.style.display='none'; Code_Open_Text_155847.style.display='none'; Code_Closed_Image_155847.style.display='inline'; Code_Closed_Text_155847.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" height="16" align="top" width="11"><span id="Code_Closed_Text_155847" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">Client</span><span id="Code_Open_Text_155847" style="display: none"><br /><!--<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; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Client&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;socket;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Socket(IO.SERVER_IP,&nbsp;IO.BIO_TCP_PORT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readLine(socket);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(UnknownHostException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(InterruptedException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;readLine(Socket&nbsp;socket)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;IOException,&nbsp;InterruptedException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;in&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;BufferedReader(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;InputStreamReader(socket.getInputStream()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;out&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;PrintWriter(socket.getOutputStream(),&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;flag&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(flag)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;command&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;in.readLine();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(command&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">Thread.sleep(2000);</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(command);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.flush();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span></span></div><br /><div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><img id="Code_Closed_Image_155937" onclick="this.style.display='none'; Code_Closed_Text_155937.style.display='none'; Code_Open_Image_155937.style.display='inline'; Code_Open_Text_155937.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" height="16" align="top" width="11"><img id="Code_Open_Image_155937" style="display: none" onclick="this.style.display='none'; Code_Open_Text_155937.style.display='none'; Code_Closed_Image_155937.style.display='inline'; Code_Closed_Text_155937.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" height="16" align="top" width="11"><span id="Code_Closed_Text_155937" style="border-right-color: #808080; border-right-width: 1px; border-right-style: solid; border-top-color: #808080; border-top-width: 1px; border-top-style: solid; border-left-color: #808080; border-left-width: 1px; border-left-style: solid; border-bottom-color: #808080; border-bottom-width: 1px; border-bottom-style: solid; background-color: #ffffff; ">IO</span><span id="Code_Open_Text_155937" style="display: none"><br /><!--<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; ">&nbsp;</span><span style="color: #0000FF; ">interface</span><span style="color: #000000; ">&nbsp;IO&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;SERVER_IP&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</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; ">"192.168.225.166";</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;BIO_TCP_PORT&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">9109</span><span style="color: #000000; ">;<br /></span></span></div><br /><p style="font-size: 10px; ">&nbsp;</p></div><img src ="http://www.blogjava.net/feuyeux/aggbug/353948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feuyeux/" target="_blank">Lu Han</a> 2011-07-08 16:01 <a href="http://www.blogjava.net/feuyeux/archive/2011/07/08/353948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java远程方法调用实践 </title><link>http://www.blogjava.net/feuyeux/archive/2011/05/26/RMI.html</link><dc:creator>Lu Han</dc:creator><author>Lu Han</author><pubDate>Thu, 26 May 2011 15:55:00 GMT</pubDate><guid>http://www.blogjava.net/feuyeux/archive/2011/05/26/RMI.html</guid><wfw:comment>http://www.blogjava.net/feuyeux/comments/351136.html</wfw:comment><comments>http://www.blogjava.net/feuyeux/archive/2011/05/26/RMI.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/feuyeux/comments/commentRss/351136.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feuyeux/services/trackbacks/351136.html</trackback:ping><description><![CDATA[<div>服务器端业务接口继承自Remote</div><div style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><div><div>public interface Biz extends Remote {</div><div></div><div><span style="white-space:pre">	</span>public String aloha() throws RemoteException;</div><div></div><div>}</div></div></div><br /><div><div>服务器端业务实现该接口</div></div><div style="background-color: #eeeeee; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><div><div>public class BizImpl extends UnicastRemoteObject implements Biz {</div><div><span style="white-space:pre">	</span>private static final long serialVersionUID = -8559392326593037120L;</div><div></div><div><span style="white-space:pre">	</span>public BizImpl() throws RemoteException {</div><div><span style="white-space:pre">		</span>super();</div><div><span style="white-space:pre">	</span>}</div><div></div><div><span style="white-space:pre">	</span>@Override</div><div><span style="white-space:pre">	</span>public String aloha() throws RemoteException {</div><div><span style="white-space:pre">		</span>return "Aloha Baby.";</div><div><span style="white-space:pre">	</span>}</div><div>}</div></div></div><br />服务器注册远程实现名称<br /><div style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><div><div>public class Server {</div><div><span style="white-space:pre">	</span>public Server() {</div><div><span style="white-space:pre">		</span>try {</div><div><span style="white-space:pre">			</span>Biz bis = new BizImpl();</div><div><span style="white-space:pre">			</span>// style-1</div><div><span style="white-space:pre">			</span>Registry registry = LocateRegistry.createRegistry(RMIParameter.PORT);</div><div><span style="white-space:pre">			</span>registry.rebind(RMIParameter.NAME, bis); // replace existing binding name</div><div><span style="white-space:pre">			</span>// style-2</div><div><span style="white-space:pre">			</span>//java.rmi.Naming.rebind(RMIParameter.NAME, bis); // replace existing binding name</div><div><span style="white-space:pre">		</span>} catch (Exception e) {</div><div><span style="white-space:pre">			</span>e.printStackTrace();</div><div><span style="white-space:pre">		</span>}</div><div><span style="white-space:pre">	</span>}</div><div></div><div><span style="white-space:pre">	</span>public static void main(String args[]) {</div><div><span style="white-space:pre">		</span>new Server();</div><div><span style="white-space:pre">	</span>}</div><div>}</div></div></div><br /><div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">style-2 需要指定一个Policy文件或者运行rmiregistry</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">java -Djava.security.policy=folder_x/rmi/policy_file creative.fire.rmi.Server</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Policy文件的内容为：</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">grant{</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp; &nbsp; &nbsp; permission java.net.SocketPermission "localhost:9527", "connect, resolve";</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">};</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">运行rmiregistry是修改 JDK 目录下的jre/lib/security/java.policy</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">rmiregistry（linux）</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">start rmiregistry(windows)</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">允许任何人(targets)作任何事情(actions)：</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">grant{</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp; &nbsp; &nbsp; &nbsp; permission java.security.AllPermission "","";</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">};</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">OR</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">grant {</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp; permission java.security.AllPermission;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">};</div></div>客户端打桩调用<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"><span style="color: #000000; "><div><div>public class Client {</div><div><span style="white-space:pre">	</span>public static void main(String args[]) {</div><div><span style="white-space:pre">		</span>try {</div><div><span style="white-space:pre">			</span>Biz bis = (Biz) Naming.lookup(RMIPREFIX + PORT + NAME);</div><div><span style="white-space:pre">			</span>System.out.println(bis.aloha());</div><div><span style="white-space:pre">		</span>} catch (Exception e) {</div><div><span style="white-space:pre">			</span>e.printStackTrace();</div><div><span style="white-space:pre">		</span>}</div><div><span style="white-space:pre">	</span>}</div><div>}</div></div></span></div><div><div></div></div><img src ="http://www.blogjava.net/feuyeux/aggbug/351136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feuyeux/" target="_blank">Lu Han</a> 2011-05-26 23:55 <a href="http://www.blogjava.net/feuyeux/archive/2011/05/26/RMI.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java安全传输实践</title><link>http://www.blogjava.net/feuyeux/archive/2011/05/26/TLS.html</link><dc:creator>Lu Han</dc:creator><author>Lu Han</author><pubDate>Thu, 26 May 2011 06:48:00 GMT</pubDate><guid>http://www.blogjava.net/feuyeux/archive/2011/05/26/TLS.html</guid><wfw:comment>http://www.blogjava.net/feuyeux/comments/351084.html</wfw:comment><comments>http://www.blogjava.net/feuyeux/archive/2011/05/26/TLS.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feuyeux/comments/commentRss/351084.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feuyeux/services/trackbacks/351084.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 传输层安全访问是通过身份验证和加密传输的过程。JDK的JSSE提供了传输层安全访问的实现。本文旨在通过一个完整的TLS通讯实例，辨析一个普遍的误导。网络上停留在理论的简单实例通常存在一个误导。在双向信任的情况下，双方都需要信任对方的证书。这样的例子很多，普遍拷贝并简述过程。其实，在实践中发现，如果双方都信任一个权威的CA，并持有该CA根证书和该CA签发的证书，即可以信任对方，实...&nbsp;&nbsp;<a href='http://www.blogjava.net/feuyeux/archive/2011/05/26/TLS.html'>阅读全文</a><img src ="http://www.blogjava.net/feuyeux/aggbug/351084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feuyeux/" target="_blank">Lu Han</a> 2011-05-26 14:48 <a href="http://www.blogjava.net/feuyeux/archive/2011/05/26/TLS.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java线程池类ThreadPoolExecutor浅析</title><link>http://www.blogjava.net/feuyeux/archive/2010/12/04/339799.html</link><dc:creator>Lu Han</dc:creator><author>Lu Han</author><pubDate>Sat, 04 Dec 2010 11:09:00 GMT</pubDate><guid>http://www.blogjava.net/feuyeux/archive/2010/12/04/339799.html</guid><wfw:comment>http://www.blogjava.net/feuyeux/comments/339799.html</wfw:comment><comments>http://www.blogjava.net/feuyeux/archive/2010/12/04/339799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feuyeux/comments/commentRss/339799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feuyeux/services/trackbacks/339799.html</trackback:ping><description><![CDATA[<span style="color: #2000ff;">本文是对java线程池的粗浅分析，视野局限于线程池的基本实现，不包含生命周期，状态管理。</span><br />
<br />
线程池的特点是将任务的提交和执行分开。这样做的好处是，能使处理器尽量多地同时执行任务。<br />
<br />
为此，线程池提供了两个角色：<br />
任务 task<br />
执行任务的工人 worker<br />
<br />
与此相关，需要考虑：<br />
<br />
工人的数量：<br />
工人数量的考量是线程池设计的一个关键。因此，这一点由构造线程池时，提供的头两个参数决定。<br />
最小雇佣数量 corePoolSize<br />
最多工人数量 maximumPoolSize<br />
<br />
何时解雇多余最小雇佣数量的工人：<br />
工人多余任务时，它们会等待任务的到来，如果规定时间内，还没有任务，那我们就解雇多余的工人。<br />
这个规定的时间就是构造子里的第三，第四个参数。<br />
&nbsp;<br />
<br />
能接受的任务数量：<br />
一个工人，某一时间只能处理一个任务。工人的数量是有限的，因此多余工人数量的任务来了时：<br />
线程池就要考虑是否接受<br />
Y:<br />
处于等待中的任务堆积到多少就不再允许接受任务 ：<br />
规定等待任务列表的容量[bound]，达到容量后不再接受新任务。<br />
<br />
无限制地接受等待任务[unbound]<br />
设置何种任务等待列表由构造子的第五个参数决定。<br />
long keepAliveTime, TimeUnit unit<br />
<br />
N:<br />
以何种方式拒绝：<br />
由构造子的第七个参数决定。<br />
<br />
第六个参数决定了<br />
工人手里执行任务线程的工厂方法。<br />
<br />
工作原理：<br />
<br />
<img style="border-color: #ff0000;" src="http://www.blogjava.net/images/blogjava_net/feuyeux/thread_pool_blogjava_fy.png" alt="" border="1" height="557" width="1161" /><br />
<br />
1.当工人数量没有达到最小雇佣数量时，每当任务来临，线程池都要创建一个工人，然后从线程工厂里创建一个新的线程，把任务作为该线程的target，把线程交给工人，把工人加入工人集合。该任务随即被执行。<br />
<br />
2.如果任务来临时，当前工人数量poolSize已经大于最小雇佣数量，表明工人已经雇佣的差不多了，先让任务等待吧。<br />
线程池尝试把任务加入任务列表，如果成功，任务提交的步骤就结束了。<br />
<br />
2.5.任务列表是并发阻塞队列，工人会不断地尝试从队列里获取任务，如果获取到任务(请看5)，工人就把任务拿去执行。这是任务的执行步骤。<br />
<br />
3.如果加入队列失败，说明任务列表已经满了，不能再往里塞任务了。<br />
这时，线程池判断工人数量是否达到最多工人数量。<br />
如果还没有，则决定再雇佣一个工人(这和开始雇佣工人的步骤没有两样)。<br />
<br />
4.如果已经达到雇佣上线，线程池没有办法了，只好拒绝该任务。<br />
拒绝的方式有：<br />
1、抛出异常给任务递送者，告诉他&#8220;老子累屁了，老子真的不干了&#8221;。 --这太粗暴了。线程池默认就这么干！<br />
2、偷蔫儿地丢弃这个任务。 --这太猥琐了。<br />
3、从任务列表里丢弃一个最近的任务，然后把这个任务放里。--这太势利眼了。<br />
4、还给任务递送者，让他自己干。--这太无耻了。<br />
<br />
5.线程池让工人等待任务的策略分两种(本文不考虑生命周期和状态)：<br />
死等！当工人数量少于或者等于最低雇佣数量时，它们没啥任务干了，就必须死等。<br />
如果在给定时间内，没有任务来到，线程池开始数人头，如果不多于最低雇佣数量，这个工人还得重新等一个给定时间那么长。<br />
<br />
6.否则，线程池把该工人的线程结束，告诉当前等待的工人，你没有任务了。不要再等了。<br />
<br />
7.没有拿到任务的工人，被清除出工人集合--该工人正式下岗。<br />
<br />
feuyeux@gmail.com<br />
<img src ="http://www.blogjava.net/feuyeux/aggbug/339799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feuyeux/" target="_blank">Lu Han</a> 2010-12-04 19:09 <a href="http://www.blogjava.net/feuyeux/archive/2010/12/04/339799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>