﻿<?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-Chan Chen Coding...</title><link>http://www.blogjava.net/czihong/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 04 May 2026 16:07:37 GMT</lastBuildDate><pubDate>Mon, 04 May 2026 16:07:37 GMT</pubDate><ttl>60</ttl><item><title>SPARK环境搭建-WINDOWS版本</title><link>http://www.blogjava.net/czihong/articles/409866.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Fri, 14 Feb 2014 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/409866.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/409866.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/409866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/409866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/409866.html</trackback:ping><description><![CDATA[转载: <a href="http://hammer.sinaapp.com/?p=333">Spark环境搭建-WIndows版本</a> <br /><br />这段时间在看Scala语言方面的资料，接触到了Spark，于是昨天下午在公司，把Spark的环境搭建起来了。安装的时候陪到了一个问题，在网上没有找到解决方案，于是自己查了一下原因。现在做一下笔记。<br /><br />1. spark的下载文件可以在官方找到，地址：http://spark.incubator.apache.org/downloads.html ，这次装的是截至目前为止，最新的版本：0.9<br /><br />2. 下载完以后，直接解压到指定的路径，例如，d：/programs<br /><br />3. 安装scala，并制定Scala_Home路径，scala安装请查看官网<br /><br />4. 按照Spark官方的安装指南，在解压的目录下，运行<br /><br />sbt/sbt package<br /><br />命令就可以。<br /><br />但是这是针对linux和OS X系统的，在windows下运行这条命令，会报错：<br /><br />not a valid command<br /><br />这个问题是因为，spark知道的sbt脚本无法在windows下运行，只要在网上下载一个windows版本的sbt，然后将里面的文件拷贝到Spark目录下的sbt （http://www.scala-sbt.org/），然后在运行命令，安装就会成功。<br /><br />&nbsp;<br />试试spark-shell<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;scala&gt;&nbsp;val&nbsp;textFile&nbsp;=&nbsp;sc.textFile(<span style="font-weight: bold;">"</span><span style="font-weight: bold;">README.md</span><span style="font-weight: bold;">"</span>)<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">12</span>&nbsp;INFO&nbsp;MemoryStore:&nbsp;ensureFreeSpace(<span style="color: #800000; ">35480</span>)&nbsp;called&nbsp;with&nbsp;curMem=<span style="color: #800000; ">177376</span>,&nbsp;maxMem=<span style="color: #800000; ">308713881</span><br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">12</span>&nbsp;INFO&nbsp;MemoryStore:&nbsp;Block&nbsp;broadcast_5&nbsp;stored&nbsp;as&nbsp;<span style="color: #0000FF; ">values</span>&nbsp;to&nbsp;memory&nbsp;(estimated&nbsp;size&nbsp;<span style="color: #800000; ">34.6</span>&nbsp;KB,&nbsp;free&nbsp;<span style="color: #800000; ">294.2</span>&nbsp;MB)<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;textFile:&nbsp;org.apache.spark.rdd.RDD[String]&nbsp;=&nbsp;MappedRDD[<span style="color: #800000; ">16</span>]&nbsp;at&nbsp;textFile&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">12</span><br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;scala&gt;&nbsp;textFile.count<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;FileInputFormat:&nbsp;Total&nbsp;input&nbsp;paths&nbsp;to&nbsp;process&nbsp;:&nbsp;<span style="color: #800000; ">1</span><br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;SparkContext:&nbsp;Starting&nbsp;job:&nbsp;count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span><br /><span style="color: #008080; ">10</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Got&nbsp;job&nbsp;<span style="color: #800000; ">7</span>&nbsp;(count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)&nbsp;with&nbsp;<span style="color: #800000; ">1</span>&nbsp;output&nbsp;partitions&nbsp;(allowLocal=false)<br /><span style="color: #008080; ">11</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Final&nbsp;stage:&nbsp;Stage&nbsp;<span style="color: #800000; ">7</span>&nbsp;(count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Parents&nbsp;of&nbsp;final&nbsp;stage:&nbsp;List()<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Missing&nbsp;parents:&nbsp;List()<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Submitting&nbsp;Stage&nbsp;<span style="color: #800000; ">7</span>&nbsp;(MappedRDD[<span style="color: #800000; ">16</span>]&nbsp;at&nbsp;textFile&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">12</span>),&nbsp;which&nbsp;has&nbsp;<span style="color: #0000FF; ">no</span>&nbsp;missin<br /><span style="color: #008080; ">15</span>&nbsp;g&nbsp;parents<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Submitting&nbsp;<span style="color: #800000; ">1</span>&nbsp;missing&nbsp;tasks&nbsp;from&nbsp;Stage&nbsp;<span style="color: #800000; ">7</span>&nbsp;(MappedRDD[<span style="color: #800000; ">16</span>]&nbsp;at&nbsp;textFile&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">12</span>)<br /><span style="color: #008080; ">17</span>&nbsp;<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;TaskSchedulerImpl:&nbsp;Adding&nbsp;task&nbsp;set&nbsp;<span style="color: #800000; ">7.0</span>&nbsp;with&nbsp;<span style="color: #800000; ">1</span>&nbsp;tasks<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;TaskSetManager:&nbsp;Starting&nbsp;task&nbsp;<span style="color: #800000; ">7.0</span>:<span style="color: #800000; ">0</span>&nbsp;as&nbsp;TID&nbsp;<span style="color: #800000; ">5</span>&nbsp;on&nbsp;executor&nbsp;localhost:&nbsp;localhost&nbsp;(PROCESS_LOCAL)<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;TaskSetManager:&nbsp;Serialized&nbsp;task&nbsp;<span style="color: #800000; ">7.0</span>:<span style="color: #800000; ">0</span>&nbsp;as&nbsp;<span style="color: #800000; ">1560</span>&nbsp;bytes&nbsp;in&nbsp;<span style="color: #800000; ">1</span>&nbsp;ms<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;Executor:&nbsp;Running&nbsp;task&nbsp;ID&nbsp;<span style="color: #800000; ">5</span><br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;BlockManager:&nbsp;Found&nbsp;block&nbsp;broadcast_5&nbsp;locally<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;HadoopRDD:&nbsp;Input&nbsp;<span style="color: #0000FF; ">split</span>:&nbsp;file:/D:/program/spark-<span style="color: #800000; ">0.9</span>.<span style="color: #800000; ">0</span>-incubating/README.md:<span style="color: #800000; ">0</span>+<span style="color: #800000; ">4491</span><br /><span style="color: #008080; ">24</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;Executor:&nbsp;Serialized&nbsp;size&nbsp;of&nbsp;result&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;<span style="color: #800000; ">5</span>&nbsp;is&nbsp;<span style="color: #800000; ">563</span><br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;Executor:&nbsp;Sending&nbsp;result&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;<span style="color: #800000; ">5</span>&nbsp;directly&nbsp;to&nbsp;driver<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;Executor:&nbsp;Finished&nbsp;task&nbsp;ID&nbsp;<span style="color: #800000; ">5</span><br /><span style="color: #008080; ">27</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;TaskSetManager:&nbsp;Finished&nbsp;TID&nbsp;<span style="color: #800000; ">5</span>&nbsp;in&nbsp;<span style="color: #800000; ">6</span>&nbsp;ms&nbsp;on&nbsp;localhost&nbsp;(progress:&nbsp;<span style="color: #800000; ">0</span>/<span style="color: #800000; ">1</span>)<br /><span style="color: #008080; ">28</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Completed&nbsp;ResultTask(<span style="color: #800000; ">7</span>,&nbsp;<span style="color: #800000; ">0</span>)<br /><span style="color: #008080; ">29</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;TaskSchedulerImpl:&nbsp;Remove&nbsp;TaskSet&nbsp;<span style="color: #800000; ">7.0</span>&nbsp;from&nbsp;pool<br /><span style="color: #008080; ">30</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Stage&nbsp;<span style="color: #800000; ">7</span>&nbsp;(count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)&nbsp;finished&nbsp;in&nbsp;<span style="color: #800000; ">0.009</span>&nbsp;s<br /><span style="color: #008080; ">31</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;SparkContext:&nbsp;Job&nbsp;finished:&nbsp;count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>,&nbsp;took&nbsp;<span style="color: #800000; ">0.012329265</span>&nbsp;s<br /><span style="color: #008080; ">32</span>&nbsp;res10:&nbsp;Long&nbsp;=&nbsp;<span style="color: #800000; ">119</span><br /><span style="color: #008080; ">33</span>&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;scala&gt;&nbsp;textFile.first<br /><span style="color: #008080; ">35</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">24</span>&nbsp;INFO&nbsp;SparkContext:&nbsp;Starting&nbsp;job:&nbsp;first&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span><br /><span style="color: #008080; ">36</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">24</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Got&nbsp;job&nbsp;<span style="color: #800000; ">8</span>&nbsp;(first&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)&nbsp;with&nbsp;<span style="color: #800000; ">1</span>&nbsp;output&nbsp;partitions&nbsp;(allowLocal=true)<br /><span style="color: #008080; ">37</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">24</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Final&nbsp;stage:&nbsp;Stage&nbsp;<span style="color: #800000; ">8</span>&nbsp;(first&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)<br /><span style="color: #008080; ">38</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">24</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Parents&nbsp;of&nbsp;final&nbsp;stage:&nbsp;List()<br /><span style="color: #008080; ">39</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">24</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Missing&nbsp;parents:&nbsp;List()<br /><span style="color: #008080; ">40</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">24</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Computing&nbsp;the&nbsp;requested&nbsp;partition&nbsp;locally<br /><span style="color: #008080; ">41</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">24</span>&nbsp;INFO&nbsp;HadoopRDD:&nbsp;Input&nbsp;<span style="color: #0000FF; ">split</span>:&nbsp;file:/D:/program/spark-<span style="color: #800000; ">0.9</span>.<span style="color: #800000; ">0</span>-incubating/README.md:<span style="color: #800000; ">0</span>+<span style="color: #800000; ">4491</span><br /><span style="color: #008080; ">42</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">24</span>&nbsp;INFO&nbsp;SparkContext:&nbsp;Job&nbsp;finished:&nbsp;first&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>,&nbsp;took&nbsp;<span style="color: #800000; ">0.002671379</span>&nbsp;s<br /><span style="color: #008080; ">43</span>&nbsp;res11:&nbsp;String&nbsp;=&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Apache&nbsp;Spark</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #008000; "></span><br /><span style="color: #008080; ">45</span>&nbsp;scala&gt;&nbsp;val&nbsp;linesWithSpark&nbsp;=&nbsp;textFile.filter(line&nbsp;=&gt;&nbsp;line.contains(<span style="font-weight: bold;">"</span><span style="font-weight: bold;">Spark</span><span style="font-weight: bold;">"</span>))<br /><span style="color: #008080; ">46</span>&nbsp;linesWithSpark:&nbsp;org.apache.spark.rdd.RDD[String]&nbsp;=&nbsp;FilteredRDD[<span style="color: #800000; ">17</span>]&nbsp;at&nbsp;filter&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">14</span><br /><span style="color: #008080; ">47</span>&nbsp;<br /><span style="color: #008080; ">48</span>&nbsp;scala&gt;&nbsp;textFile.filter(line=&gt;&nbsp;line.contains(<span style="font-weight: bold;">"</span><span style="font-weight: bold;">spark</span><span style="font-weight: bold;">"</span>)).count<br /><span style="color: #008080; ">49</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;SparkContext:&nbsp;Starting&nbsp;job:&nbsp;count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span><br /><span style="color: #008080; ">50</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Got&nbsp;job&nbsp;<span style="color: #800000; ">9</span>&nbsp;(count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)&nbsp;with&nbsp;<span style="color: #800000; ">1</span>&nbsp;output&nbsp;partitions&nbsp;(allowLocal=false)<br /><span style="color: #008080; ">51</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Final&nbsp;stage:&nbsp;Stage&nbsp;<span style="color: #800000; ">9</span>&nbsp;(count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)<br /><span style="color: #008080; ">52</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Parents&nbsp;of&nbsp;final&nbsp;stage:&nbsp;List()<br /><span style="color: #008080; ">53</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Missing&nbsp;parents:&nbsp;List()<br /><span style="color: #008080; ">54</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Submitting&nbsp;Stage&nbsp;<span style="color: #800000; ">9</span>&nbsp;(FilteredRDD[<span style="color: #800000; ">18</span>]&nbsp;at&nbsp;filter&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>),&nbsp;which&nbsp;has&nbsp;<span style="color: #0000FF; ">no</span>&nbsp;missin<br /><span style="color: #008080; ">55</span>&nbsp;g&nbsp;parents<br /><span style="color: #008080; ">56</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Submitting&nbsp;<span style="color: #800000; ">1</span>&nbsp;missing&nbsp;tasks&nbsp;from&nbsp;Stage&nbsp;<span style="color: #800000; ">9</span>&nbsp;(FilteredRDD[<span style="color: #800000; ">18</span>]&nbsp;at&nbsp;filter&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)<br /><span style="color: #008080; ">57</span>&nbsp;<br /><span style="color: #008080; ">58</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;TaskSchedulerImpl:&nbsp;Adding&nbsp;task&nbsp;set&nbsp;<span style="color: #800000; ">9.0</span>&nbsp;with&nbsp;<span style="color: #800000; ">1</span>&nbsp;tasks<br /><span style="color: #008080; ">59</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;TaskSetManager:&nbsp;Starting&nbsp;task&nbsp;<span style="color: #800000; ">9.0</span>:<span style="color: #800000; ">0</span>&nbsp;as&nbsp;TID&nbsp;<span style="color: #800000; ">6</span>&nbsp;on&nbsp;executor&nbsp;localhost:&nbsp;localhost&nbsp;(PROCESS_LOCAL)<br /><span style="color: #008080; ">60</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;TaskSetManager:&nbsp;Serialized&nbsp;task&nbsp;<span style="color: #800000; ">9.0</span>:<span style="color: #800000; ">0</span>&nbsp;as&nbsp;<span style="color: #800000; ">1642</span>&nbsp;bytes&nbsp;in&nbsp;<span style="color: #800000; ">0</span>&nbsp;ms<br /><span style="color: #008080; ">61</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;Executor:&nbsp;Running&nbsp;task&nbsp;ID&nbsp;<span style="color: #800000; ">6</span><br /><span style="color: #008080; ">62</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;BlockManager:&nbsp;Found&nbsp;block&nbsp;broadcast_5&nbsp;locally<br /><span style="color: #008080; ">63</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;HadoopRDD:&nbsp;Input&nbsp;<span style="color: #0000FF; ">split</span>:&nbsp;file:/D:/program/spark-<span style="color: #800000; ">0.9</span>.<span style="color: #800000; ">0</span>-incubating/README.md:<span style="color: #800000; ">0</span>+<span style="color: #800000; ">4491</span><br /><span style="color: #008080; ">64</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;Executor:&nbsp;Serialized&nbsp;size&nbsp;of&nbsp;result&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;<span style="color: #800000; ">6</span>&nbsp;is&nbsp;<span style="color: #800000; ">563</span><br /><span style="color: #008080; ">65</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;Executor:&nbsp;Sending&nbsp;result&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;<span style="color: #800000; ">6</span>&nbsp;directly&nbsp;to&nbsp;driver<br /><span style="color: #008080; ">66</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;Executor:&nbsp;Finished&nbsp;task&nbsp;ID&nbsp;<span style="color: #800000; ">6</span><br /><span style="color: #008080; ">67</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;TaskSetManager:&nbsp;Finished&nbsp;TID&nbsp;<span style="color: #800000; ">6</span>&nbsp;in&nbsp;<span style="color: #800000; ">10</span>&nbsp;ms&nbsp;on&nbsp;localhost&nbsp;(progress:&nbsp;<span style="color: #800000; ">0</span>/<span style="color: #800000; ">1</span>)<br /><span style="color: #008080; ">68</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Completed&nbsp;ResultTask(<span style="color: #800000; ">9</span>,&nbsp;<span style="color: #800000; ">0</span>)<br /><span style="color: #008080; ">69</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;TaskSchedulerImpl:&nbsp;Remove&nbsp;TaskSet&nbsp;<span style="color: #800000; ">9.0</span>&nbsp;from&nbsp;pool<br /><span style="color: #008080; ">70</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Stage&nbsp;<span style="color: #800000; ">9</span>&nbsp;(count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)&nbsp;finished&nbsp;in&nbsp;<span style="color: #800000; ">0.010</span>&nbsp;s<br /><span style="color: #008080; ">71</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;SparkContext:&nbsp;Job&nbsp;finished:&nbsp;count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>,&nbsp;took&nbsp;<span style="color: #800000; ">0.020335125</span>&nbsp;s<br /><span style="color: #008080; ">72</span>&nbsp;res12:&nbsp;Long&nbsp;=&nbsp;<span style="color: #800000; ">7</span></div><br />另外Spark官网提供了入门的四段视频，但是国内被墙了，无法观看youtube，我把这四段视频放到了土豆网，大家可以看看。<br /><br /><a href="http://www.tudou.com/programs/view/sL67wfUk3AA/">Spark Screencast 1 &#8211; 搭建Spark环境</a><br /><br /><a href="http://www.tudou.com/programs/view/4iX6i6Ejmx8/">Spark Screencast 2 &#8211; Spark文档总览</a><br /><br /><a href="http://www.tudou.com/programs/view/QKpnT-f6Ef0/">Spark Screencast 3 &#8211; 转换和缓存</a><br /><br /><a href="http://www.tudou.com/programs/view/p0jhRIMkqAk/">Spark Screencast 4 &#8211; Scala独立任务</a><img src ="http://www.blogjava.net/czihong/aggbug/409866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2014-02-14 16:21 <a href="http://www.blogjava.net/czihong/articles/409866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> top命令的Load average 含义及性能参考基值</title><link>http://www.blogjava.net/czihong/articles/399670.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Thu, 23 May 2013 09:47:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/399670.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/399670.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/399670.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/399670.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/399670.html</trackback:ping><description><![CDATA[<div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;"><pre style="word-wrap: break-word; margin-top: 0px; margin-bottom: 0px; padding: 0px;"><code style="word-wrap: break-word;">$ uptime<br style="word-wrap: break-word;" />11:12:26 up 3:44, 4 users, load average: 0.38, 0.31, 0.19<br style="word-wrap: break-word;" /></code></pre><p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px;">系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树。如果一个进程满足以下条件则其就会位于运行队列中：</p><ul style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none;"><li style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: disc outside;">它没有在等待I/O操作的结果</li><li style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: disc outside;">它没有主动进入等待状态(也就是没有调用'wait')</li><li style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: disc outside;">没有被停止(例如：等待终止)</li></ul><p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px;">上面的输出，load average后面分别是1分钟、5分钟、15分钟的负载情况。数据是每隔5秒钟检查一次活跃的进程数，然后根据这个数值算出来的。如果这个数除以CPU 的数目，结果高于5的时候就表明系统在超负荷运转了。</p></div><br style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;" /><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">&nbsp;</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">Linux系统Load average负载详细解释&nbsp; 　我们知道判断一个系统的负载可以使用top，uptime等命令去查看，它分别记录了一分钟、五分钟、以及十五分钟的系统平均负载</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　例如我的某台服务器：</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　$ uptime</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　09:50:21 up 200 days, 15:07, 1 user, load average: 0.27, 0.33, 0.37</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　大部分的人都认为这个数字越小越好，其实有很多关联的提示信息，今天看到这个好文，应该可以给大家说清楚很多问题，转一下：</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　原文链接：&nbsp;<a href="http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages" style="word-wrap: break-word; text-decoration: none; color: #565656;">http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages</a></div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　你可能对于 Linux 的负载均值（load averages）已有了充分的了解。负载均值在 uptime 或者 top 命令中可以看到，它们可能会显示成这个样子：</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　load average: 0.09, 0.05, 0.01</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　很多人会这样理解负载均值：三个数分别代表不同时间段的系统平均负载（一分钟、五 分钟、以及十五分钟），它们的数字当然是越小越好。数字越高，说明服务器的负载越 大，这也可能是服务器出现某种问题的信号。</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　而事实不完全如此，是什么因素构成了负载均值的大小，以及如何区分它们目前的状况是 &#8220;好&#8221;还是&#8220;糟糕&#8221;？什么时候应该注意哪些不正常的数值？</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　回答这些问题之前，首先需要了解下这些数值背后的些知识。我们先用最简单的例子说明， 一台只配备一块单核处理器的服务器。</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　行车过桥</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　一只单核的处理器可以形象得比喻成一条单车道。设想下，你现在需要收取这条道路的过桥 费 &#8212; 忙于处理那些将要过桥的车辆。你首先当然需要了解些信息，例如车辆的载重、以及 还有多少车辆正在等待过桥。如果前面没有车辆在等待，那么你可以告诉后面的司机通过。 如果车辆众多，那么需要告知他们可能需要稍等一会。</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　因此，需要些特定的代号表示目前的车流情况，例如：</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　0.00 表示目前桥面上没有任何的车流。 实际上这种情况与 0.00 和 1.00 之间是相同的，总而言之很通畅，过往的车辆可以丝毫不用等待的通过。</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　1.00 表示刚好是在这座桥的承受范围内。 这种情况不算糟糕，只是车流会有些堵，不过这种情况可能会造成交通越来越慢。</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　超过 1.00，那么说明这座桥已经超出负荷，交通严重的拥堵。 那么情况有多糟糕？ 例如 2.00 的情况说明车流已经超出了桥所能承受的一倍，那么将有多余过桥一倍的车辆正在焦急的等待。3.00 的话情况就更不妙了，说明这座桥基本上已经快承受不了，还有超出桥负载两倍多的车辆正在等待。</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　上面的情况和处理器的负载情况非常相似。一辆汽车的过桥时间就好比是处理器处理某线程 的实际时间。Unix 系统定义的进程运行时长为所有处理器内核的处理时间加上线程 在队列中等待的时间。</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　和收过桥费的管理员一样，你当然希望你的汽车（操作）不会被焦急的等待。所以，理想状态 下，都希望负载平均值小于 1.00 。当然不排除部分峰值会超过 1.00，但长此以往保持这 个状态，就说明会有问题，这时候你应该会很焦急。</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　&#8220;所以你说的理想负荷为 1.00 ？&#8221;</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　嗯，这种情况其实并不完全正确。负荷 1.00 说明系统已经没有剩余的资源了。在实际情况中 ，有经验的系统管理员都会将这条线划在 0.70：</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　&#8220;需要进行调查法则&#8221;： 如果长期你的系统负载在 0.70 上下，那么你需要在事情变得更糟糕之前，花些时间了解其原因。</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　&#8220;现在就要修复法则&#8221;：1.00 。 如果你的服务器系统负载长期徘徊于 1.00，那么就应该马上解决这个问题。否则，你将半夜接到你上司的电话，这可不是件令人愉快的事情。</div><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">　　&#8220;凌晨三点半锻炼身体法则&#8221;：5.00。 如果你的服务器负载超过了 5.00 这个数字，那么你将失去你的睡眠，还得在会议中说明这情况发生的原因，总之千万不要让它发生。</div><img src ="http://www.blogjava.net/czihong/aggbug/399670.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-05-23 17:47 <a href="http://www.blogjava.net/czihong/articles/399670.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java CyclicBarrier介绍</title><link>http://www.blogjava.net/czihong/articles/399587.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Wed, 22 May 2013 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/399587.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/399587.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/399587.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/399587.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/399587.html</trackback:ping><description><![CDATA[<p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><strong style="padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px; color: #aa00ff;"><span style="color: #000000; font-weight: normal;">Refer to:&nbsp;</span><a href="http://my.oschina.net/redhouse/blog/60739" style="font-weight: normal; font-family: verdana, 'courier new'; line-height: 21px;">http://my.oschina.net/redhouse/blog/60739<br /></a><br />CyclicBarrier&nbsp;</span></strong>(周期障碍)类可以帮助同步，它允许一组线程等待整个线程组到达公共屏障点。CyclicBarrier 是使用整型变量构造的，其确定组中的线程数。当一个线程到达屏障时（通过调用 CyclicBarrier.await()），它会被阻塞，直到所有线程都到达屏障，然后在该点允许所有线程继续执行。与CountDownLatch不同的是，CyclicBarrier 所有公共线程都到达后，可以继续执行下一个目标点，而CountDownLatch第一次到达指定点后，也就是记数器减制零，就无法再次执行下一目标工作。下面主要演义CyclicBarrier 的用法：<br /><br /></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">package com.test;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">import java.text.SimpleDateFormat;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">import java.util.Date;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">import java.util.concurrent.BrokenBarrierException;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">import java.util.concurrent.CyclicBarrier;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">import java.util.concurrent.ExecutorService;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">import java.util.concurrent.Executors;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">public class TestCyclicBarrier {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">private static int[] timeWalk = { 5, 8, 15, 15, 10 }; &nbsp;<span style="padding: 0px; margin: 0px; color: #ff0000;">// 徒步需要的时间</span></span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">private static int[] timeSelf = { 1, 3, 4, 4, 5 }; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="padding: 0px; margin: 0px; color: #ff0000;">&nbsp;// 自驾游</span></span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">private static int[] timeBus = { 2, 4, 6, 6, 7 }; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="padding: 0px; margin: 0px; color: #ff0000;">// 旅游大巴</span></span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">static String now() {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return sdf.format(new Date()) + ": ";</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">}</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">static class Tour implements Runnable {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private &nbsp; int[] &nbsp; &nbsp; times;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private &nbsp; CyclicBarrier &nbsp; &nbsp;barrier;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private &nbsp; String &nbsp; tourName;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">public Tour(CyclicBarrier barrier, String tourName, int[] times) {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.times = times;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.tourName = tourName;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.barrier = barrier;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">}</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">public void run() {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; try {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Thread.sleep(times[0] * 1000);</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(now() + tourName + " 合肥");</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;barrier.await();</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Thread.sleep(times[1] * 1000);</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(now() + tourName + " 南京");</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;barrier.await();</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Thread.sleep(times[4] * 1000);</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(now() + tourName + " 上海");</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;barrier.await();</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(tourName + "飞机 合肥");</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} catch (InterruptedException e) {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e.printStackTrace();</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;} catch (BrokenBarrierException e) {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;e.printStackTrace();</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; }</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">}</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;">&nbsp;</p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">public static void main(String[] args) {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CyclicBarrier barrier = new CyclicBarrier(3);</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ExecutorService exec = Executors.newFixedThreadPool(3);</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;exec.submit(new Tour(barrier, "徒步", timeWalk));</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;exec.submit(new Tour(barrier, "自驾", timeSelf));</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;exec.submit(new Tour(barrier, "大巴", timeBus));</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exec.shutdown();</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; }</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">}</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;">最后执行结果如下：</p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:35: 自驾 合肥</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:36: 大巴 合肥</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:39: 徒步 合肥</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;"><br style="padding: 0px; margin: 0px;" /></span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:42: 自驾 南京</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:43: 大巴 南京</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:47: 徒步 南京</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;"><br style="padding: 0px; margin: 0px;" /></span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:52: 自驾 上海</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:54: 大巴 上海</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:57: 徒步 上海</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;"><br style="padding: 0px; margin: 0px;" /></span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">徒步飞机 合肥</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">自驾飞机 合肥</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">大巴飞机 合肥</span></p><img src ="http://www.blogjava.net/czihong/aggbug/399587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-05-22 09:57 <a href="http://www.blogjava.net/czihong/articles/399587.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IE6的连接数限制问题</title><link>http://www.blogjava.net/czihong/articles/399561.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Tue, 21 May 2013 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/399561.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/399561.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/399561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/399561.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/399561.html</trackback:ping><description><![CDATA[<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">先描述一下问题：&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">有一个管理Job的UI，选中一些Job可以Run，每次只能启动一个。还有一个UI通过Timer定时发Ajax请求服务端，查询并显示Job的运行状况（进度）。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">奇怪的问题出现了：&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">1）在FireFox和IE8运行正常（貌似正常，稍后再解释）。其他浏览器未测试。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">2）IE6,7及更早版本，Timer无法检测到多于1个的Job运行。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">先检查了一遍代码，Timer的控制没有问题。不行就使用Fiddler吧。刚好是IE的问题。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">观察HTTP发现一个现象，运行Job的HTTP似乎没有成功，因为Body是-1，之后是每隔一秒的Timer发起的HTTP。如果再启动一个Job，发现Timer停止了！！&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">等待第一个Job运行成功之后，Timer又恢复了（重新发送Ajax请求）！！&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">似乎是运行Job的请求阻塞了（实际上该请求长时间没有返回，因为运行Job需要几分钟甚至更多时间）。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">为啥不使用DWR3.0的Push技术？后来跟同事讨论明白，这不过是把Timer从客户端转移到了服务端。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">记起来了，俺好像读DWR源代码的时候（当时对如何实现推非常感兴趣），见过一段代码分析Browser的类型和连接数，有的情况还抛出了异常。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">明白了，肯定是IE6有连接数限制问题，后来得知，默认情况下，它不支持同时超过2个连接。哈哈。这就对了。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">RunJob占用了一个（几分钟不等），&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">Timer占用了一个（很短暂）。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">刚好2个。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: black;"><img src="http://zerozone.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">class</span>&nbsp;BrowserDetect&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">/**</span>&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="width: auto; border-width: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;How&nbsp;many&nbsp;connections&nbsp;can&nbsp;this&nbsp;browser&nbsp;open&nbsp;simultaneously?</span>&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="width: auto; border-width: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;request&nbsp;The&nbsp;request&nbsp;so&nbsp;we&nbsp;can&nbsp;get&nbsp;at&nbsp;the&nbsp;user-agent&nbsp;header</span>&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="width: auto; border-width: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;The&nbsp;number&nbsp;of&nbsp;connections&nbsp;that&nbsp;we&nbsp;think&nbsp;this&nbsp;browser&nbsp;can&nbsp;take</span>&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="width: auto; border-width: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">static</span>&nbsp;<span style="color: #7f0055;">int</span>&nbsp;getConnectionLimit(HttpServletRequest&nbsp;request)&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">if</span>&nbsp;(atLeast(request,&nbsp;UserAgent.IE,&nbsp;<span style="color: #c00000;">8</span>))&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;<span style="color: #c00000;">6</span>;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">if</span>&nbsp;(atLeast(request,&nbsp;UserAgent.Firefox,&nbsp;<span style="color: #c00000;">3</span>))&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;<span style="color: #c00000;">6</span>;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">else</span>&nbsp;<span style="color: #7f0055;">if</span>&nbsp;(atLeast(request,&nbsp;UserAgent.AppleWebKit,&nbsp;<span style="color: #c00000;">8</span>))&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;<span style="color: #c00000;">4</span>;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">else</span>&nbsp;<span style="color: #7f0055;">if</span>&nbsp;(atLeast(request,&nbsp;UserAgent.Opera,&nbsp;<span style="color: #c00000;">9</span>))&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;<span style="color: #c00000;">4</span>;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">else</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;<span style="color: #c00000;">2</span>;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="width: auto; border-width: 0px;">//....</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}&nbsp;&nbsp;</li></ol></div><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">接下来就是查资料做试验，验证该问题是否正确。通过在注册表设置Internet Settings参数，实现了更多连接。例如10个。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">但是Job可能很多，不可能无限制增加连接数，所以RunJob不应长期占用连接，它应该把Job插入队列并立即返回。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">至此问题的源头终于找到了，Fiddler又帮了大忙。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">读源代码是了解技术运作细节的最好方法，此外还能学到好的编程习惯。</span><img src ="http://www.blogjava.net/czihong/aggbug/399561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-05-21 15:19 <a href="http://www.blogjava.net/czihong/articles/399561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 枚举7常见种用法</title><link>http://www.blogjava.net/czihong/articles/399319.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Wed, 15 May 2013 11:57:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/399319.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/399319.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/399319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/399319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/399319.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">DK1.5引入了新的类型&#8212;&#8212;枚举。在&nbsp;<span style="font-family: 'Times New Roman';">Java</span>&nbsp;中它虽然算个&#8220;小&#8221;功能，却给我的开发带来了&#8220;大&#8221;方便。</p><h2>用法一：常量</h2><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">在<span style="font-family: 'Times New Roman';">JDK1.5</span>&nbsp;之前，我们定义常量都是：&nbsp;<span style="font-family: 'Times New Roman';">public static fianl....</span>&nbsp;。现在好了，有了枚举，可以把相关的常量分组到一个枚举类型里，而且枚举提供了比常量更多的方法。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: black;"><img src="http://softbeta.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">enum</span>&nbsp;Color&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;RED,&nbsp;GREEN,&nbsp;BLANK,&nbsp;YELLOW&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}&nbsp;&nbsp;</li></ol></div>&nbsp;<h2>用法二：switch</h2><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">JDK1.6之前的switch语句只支持int,char,enum类型，使用枚举，能让我们的代码可读性更强。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: black;"><img src="http://softbeta.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">enum</span>&nbsp;Signal&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;GREEN,&nbsp;YELLOW,&nbsp;RED&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">class</span>&nbsp;TrafficLight&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;Signal&nbsp;color&nbsp;=&nbsp;Signal.RED;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">void</span>&nbsp;change()&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">switch</span>&nbsp;(color)&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">case</span>&nbsp;RED:&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color&nbsp;=&nbsp;Signal.GREEN;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">break</span>;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">case</span>&nbsp;YELLOW:&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color&nbsp;=&nbsp;Signal.RED;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">break</span>;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">case</span>&nbsp;GREEN:&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color&nbsp;=&nbsp;Signal.YELLOW;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">break</span>;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}&nbsp;&nbsp;</li></ol></div>&nbsp;<h2>用法三：向枚举中添加新方法</h2><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">如果打算自定义自己的方法，那么必须在enum实例序列的最后添加一个分号。而且&nbsp;<span style="font-family: 'Courier New';">Java</span>&nbsp;要求必须先定义&nbsp;<span style="font-family: 'Courier New';">enum</span>实例。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: black;"><img src="http://softbeta.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">enum</span>&nbsp;Color&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;RED("红色",&nbsp;<span style="color: #c00000;">1</span>),&nbsp;GREEN("绿色",&nbsp;<span style="color: #c00000;">2</span>),&nbsp;BLANK("白色",&nbsp;<span style="color: #c00000;">3</span>),&nbsp;YELLO("黄色",&nbsp;<span style="color: #c00000;">4</span>);&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//&nbsp;成员变量</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;String&nbsp;name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;<span style="color: #7f0055;">int</span>&nbsp;index;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//&nbsp;构造方法</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;Color(String&nbsp;name,&nbsp;<span style="color: #7f0055;">int</span>&nbsp;index)&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">this</span>.name&nbsp;=&nbsp;name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">this</span>.index&nbsp;=&nbsp;index;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//&nbsp;普通方法</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">static</span>&nbsp;String&nbsp;getName(<span style="color: #7f0055;">int</span>&nbsp;index)&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">for</span>&nbsp;(Color&nbsp;c&nbsp;:&nbsp;Color.values())&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">if</span>&nbsp;(c.getIndex()&nbsp;==&nbsp;index)&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;c.name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;<span style="color: #7f0055;">null</span>;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//&nbsp;get&nbsp;set&nbsp;方法</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;String&nbsp;getName()&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">void</span>&nbsp;setName(String&nbsp;name)&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">this</span>.name&nbsp;=&nbsp;name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">int</span>&nbsp;getIndex()&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;index;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">void</span>&nbsp;setIndex(<span style="color: #7f0055;">int</span>&nbsp;index)&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">this</span>.index&nbsp;=&nbsp;index;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}&nbsp;&nbsp;</li></ol></div>&nbsp;<h2>用法四：覆盖枚举的方法</h2><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">下面给出一个toString()方法覆盖的例子。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: black;"><img src="http://softbeta.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">enum</span>&nbsp;Color&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;RED("红色",&nbsp;<span style="color: #c00000;">1</span>),&nbsp;GREEN("绿色",&nbsp;<span style="color: #c00000;">2</span>),&nbsp;BLANK("白色",&nbsp;<span style="color: #c00000;">3</span>),&nbsp;YELLO("黄色",&nbsp;<span style="color: #c00000;">4</span>);&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//&nbsp;成员变量</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;String&nbsp;name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;<span style="color: #7f0055;">int</span>&nbsp;index;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//&nbsp;构造方法</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;Color(String&nbsp;name,&nbsp;<span style="color: #7f0055;">int</span>&nbsp;index)&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">this</span>.name&nbsp;=&nbsp;name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">this</span>.index&nbsp;=&nbsp;index;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//覆盖方法</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #646464;">@Override</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;String&nbsp;toString()&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;<span style="color: #7f0055;">this</span>.index+"_"+<span style="color: #7f0055;">this</span>.name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}&nbsp;&nbsp;</li></ol></div>&nbsp;<h2>用法五：实现接口</h2><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">所有的枚举都继承自java.lang.Enum类。由于<span style="font-family: 'Courier New';">Java</span>&nbsp;不支持多继承，所以枚举对象不能再继承其他类。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: black;"><img src="http://softbeta.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">interface</span>&nbsp;Behaviour&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">void</span>&nbsp;print();&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;getInfo();&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">enum</span>&nbsp;Color&nbsp;<span style="color: #7f0055;">implements</span>&nbsp;Behaviour{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;RED("红色",&nbsp;<span style="color: #c00000;">1</span>),&nbsp;GREEN("绿色",&nbsp;<span style="color: #c00000;">2</span>),&nbsp;BLANK("白色",&nbsp;<span style="color: #c00000;">3</span>),&nbsp;YELLO("黄色",&nbsp;<span style="color: #c00000;">4</span>);&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//&nbsp;成员变量</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;String&nbsp;name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;<span style="color: #7f0055;">int</span>&nbsp;index;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//&nbsp;构造方法</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;Color(String&nbsp;name,&nbsp;<span style="color: #7f0055;">int</span>&nbsp;index)&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">this</span>.name&nbsp;=&nbsp;name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">this</span>.index&nbsp;=&nbsp;index;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="width: auto; border-width: 0px;">//接口方法</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #646464;">@Override</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;String&nbsp;getInfo()&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;<span style="color: #7f0055;">this</span>.name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//接口方法</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #646464;">@Override</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">void</span>&nbsp;print()&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span style="color: #7f0055;">this</span>.index+":"+<span style="color: #7f0055;">this</span>.name);&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}&nbsp;&nbsp;</li></ol></div>&nbsp;<h2>用法六：使用接口组织枚举</h2><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: black;"><img src="http://softbeta.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">interface</span>&nbsp;Food&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">enum</span>&nbsp;Coffee&nbsp;<span style="color: #7f0055;">implements</span>&nbsp;Food{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">enum</span>&nbsp;Dessert&nbsp;<span style="color: #7f0055;">implements</span>&nbsp;Food{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FRUIT,&nbsp;CAKE,&nbsp;GELATO&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}&nbsp;&nbsp;</li></ol></div>&nbsp;<h2>用法七：关于枚举集合的使用</h2><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复；EnumMap中的key是enum类型，而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述，可以参考JDK文档。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">关于枚举的实现细节和原理请参考：</p><img src ="http://www.blogjava.net/czihong/aggbug/399319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-05-15 19:57 <a href="http://www.blogjava.net/czihong/articles/399319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Curl命令使用整理</title><link>http://www.blogjava.net/czihong/articles/399038.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Thu, 09 May 2013 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/399038.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/399038.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/399038.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/399038.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/399038.html</trackback:ping><description><![CDATA[<div style="margin: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">Refer to:&nbsp;<a href="http://www.cnblogs.com/wangkangluo1/archive/2012/04/17/2453975.html">http://www.cnblogs.com/wangkangluo1/archive/2012/04/17/2453975.html<br /></a><br />可以看作命令行浏览器</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">1、开启gzip请求<br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -I http://www.sina.com.cn/ -H Accept-Encoding:gzip,defalte</span><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /><strong style="margin: 0px; padding: 0px;">2、监控网页的响应时间</strong><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -o /dev/null -s -w "time_connect: %{time_connect}\ntime_starttransfer: %{time_starttransfer}\ntime_total: %{time_total}\n" "http://www.kklinux.com"</span><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /><strong style="margin: 0px; padding: 0px;">3. 监控站点可用性</strong><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -o /dev/null -s -w %{http_code} "http://www.kklinux.com"</span><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /><strong style="margin: 0px; padding: 0px;">4、以http1.0协议请求（默认为http1.1）</strong>&nbsp;<br style="margin: 0px; padding: 0px;" />curl -0 ..............&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）读取网页&nbsp;<br style="margin: 0px; padding: 0px;" />　　<span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">$ curl linuxidc.com"&gt;http://www.linuxidc.com</span>&nbsp;<br style="margin: 0px; padding: 0px;" />　　2）保存网页&nbsp;<br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">　　$ curl http://www.linuxidc.com &gt; page.html $ curl -o page.html http://www.linuxidc.com&nbsp;</span><br style="margin: 0px; padding: 0px;" />　　3）使用的proxy服务器及其端口：-x&nbsp;<br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">　　$ curl -x 123.45.67.89：1080 -o page.html http://www.linuxidc.com&nbsp;</span><br style="margin: 0px; padding: 0px;" />　　4）使用cookie来记录session信息&nbsp;<br style="margin: 0px; padding: 0px;" />　　<span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">$ curl -x 123.45.67.89：1080 -o page.html -D cookie0001.txt http://www.linuxidc.com</span>&nbsp;<br style="margin: 0px; padding: 0px;" />option： -D 是把http的response里面的cookie信息存到一个特别的文件中去，这样，当页面被存到page.html的同时，cookie信息也被存到了cookie0001.txt里面了&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;5）那么，下一次访问的时候，如何继续使用上次留下的cookie信息呢？&nbsp;<br style="margin: 0px; padding: 0px;" />　　使用option来把上次的cookie信息追加到http request里面去：-b&nbsp;<br style="margin: 0px; padding: 0px;" />　　<span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">$ curl -x 123.45.67.89：1080 -o page1.html -D cookie0002.txt -b cookie0001.txt http://www.linuxidc.com&nbsp;</span><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" />6）浏览器信息~~~~&nbsp;<br style="margin: 0px; padding: 0px;" />随意指定自己这次访问所宣称的自己的浏览器信息： -A<br style="margin: 0px; padding: 0px;" />curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.yahoo.com&nbsp;<br style="margin: 0px; padding: 0px;" />这样，服务器端接到访问的要求，会认为你是一个运行在Windows 2000上的IE6.0，嘿嘿嘿，其实也许你用的是苹果机呢！&nbsp;<br style="margin: 0px; padding: 0px;" />而"Mozilla/4.73 [en] (X11; U; Linux 2.2; 15 i686"则可以告诉对方你是一台PC上跑着的Linux，用的是Netscape 4.73，呵呵呵&nbsp;<br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" />7）<br style="margin: 0px; padding: 0px;" />另外一个服务器端常用的限制方法，就是检查http访问的referer。比如你先访问首页，再访问里面所指定的下载页，这第二次访问的referer地址就是第一次访问成功后的页面地&nbsp;<br style="margin: 0px; padding: 0px;" />址。这样，<span style="margin: 0px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff0102;">服务器端只要发现对下载页面某次访问的referer地址不 是首页的地址，就可以断定那是个盗连了</span></span><span style="margin: 0px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">~~~~~&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">讨厌讨厌~~~我就是要盗连~~~~~！！</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">幸好curl给我们提供了设定referer的option： -e</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -e "mail.yahoo.com" -o page.html -D cookie0001.txt http://www.yahoo.com&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">这样，就可以骗对方的服务器，你是从mail.yahoo.com点击某个链接过来的了，呵呵呵&nbsp;</span><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">8）curl 下载文件&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">刚才讲过了，下载页面到一个文件里，可以使用 -o ，下载文件也是一样。</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">比如，&nbsp;<span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -o 1.jpg http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG</span></span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">这里教大家一个新的option： -O</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">大写的O，这么用：&nbsp;<span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG</span></span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">这样，就可以按照服务器上的文件名，自动存在本地了！&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">再来一个更好用的。</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">如果screen1.JPG以外还有screen2.JPG、screen3.JPG、....、screen10.JPG需要下载，难不成还要让我们写一个script来完成这些操作？</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">不干！</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">在curl里面，这么写就可以了：</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen[1-10].JPG&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">呵呵呵，厉害吧？！~~~&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">9）</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">再来，我们继续讲解下载！</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -O http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG</span>&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">这样产生的下载，就是</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">~zzh/001.JPG</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">~zzh/002.JPG</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">...</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">~zzh/201.JPG</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">~nick/001.JPG</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">~nick/002.JPG</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">...</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">~nick/201.JPG&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">够方便的了吧？哈哈哈&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">咦？高兴得太早了。</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">由于zzh/nick下的文件名都是001，002...，201，下载下来的文件重名，后面的把前面的文件都给覆盖掉了~~~&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">没关系，我们还有更狠的！</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -o #2_#1.jpg http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">--这是.....自定义文件名的下载？</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">--对头，呵呵！&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">#1是变量，指的是{zzh,nick}这部分，第一次取值zzh，第二次取值nick</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">#2代表的变量，则是第二段可变部分---[001-201]，取值从001逐一加到201</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">这样，自定义出来下载下来的文件名，就变成了这样：</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">原来： ~zzh/001.JPG ---&gt; 下载后： 001-zzh.JPG</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">原来： ~nick/001.JPG ---&gt; 下载后： 001-nick.JPG&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">这样一来，就不怕文件重名啦，呵呵&nbsp;</span><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">9）</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">继续讲下载</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">我们平时在windows平台上，flashget这样的工具可以帮我们分块并行下载，还可以断线续传。</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">curl在这些方面也不输给谁，嘿嘿&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">比如我们下载screen1.JPG中，突然掉线了，我们就可以这样开始续传</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -c -O http://cgi2.tky.3wb.ne.jp/~zzh/screen1.JPG&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">当然，你不要拿个flashget下载了一半的文件来糊弄我~~~~别的下载软件的半截文件可不一定能用哦~~~&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">分块下载，我们使用这个option就可以了： -r</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">举例说明</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">比如我们有一个http://cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 要下载（赵老师的电话朗诵 :D ）</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">我们就可以用这样的命令：</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -r 0-10240 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &amp;\</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -r 10241-20480 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &amp;\</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -r 20481-40960 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &amp;\</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -r 40961- -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">这样就可以分块下载啦。</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">不过你需要自己把这些破碎的文件合并起来</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">如果你用UNIX或苹果，用 cat zhao.part* &gt; zhao.mp3就可以</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">如果用的是Windows，用copy /b 来解决吧，呵呵&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">上面讲的都是http协议的下载，其实ftp也一样可以用。</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">用法嘛，</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -u name:passwd ftp://ip:port/path/file</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">或者大家熟悉的</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl ftp://name:passwd@ip:port/path/file&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">&nbsp;&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">10)上传的option是 -T&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">比如我们向ftp传一个文件：&nbsp;<span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -T localfile -u name:passwd ftp://upload_site:port/path/&nbsp;</span></span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">当然，向http服务器上传文件也可以</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">比如&nbsp;<span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -T localfile http://cgi2.tky.3web.ne.jp/~zzh/abc.cgi</span></span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">注意，这时候，使用的协议是HTTP的PUT method&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">刚才说到PUT，嘿嘿，自然让老服想起来了其他几种methos还没讲呢！</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">GET和POST都不能忘哦。&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">http提交一个表单，比较常用的是POST模式和GET模式&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff0000;">GET模式什么option都不用，只需要把变量写在url里面就可以了<br style="margin: 0px; padding: 0px;" />比如：<br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl http://www.yahoo.com/login.cgi?user=nickwolfe&amp;password=12345&nbsp;</span><br style="margin: 0px; padding: 0px;" />而POST模式的option则是 -d&nbsp;<br style="margin: 0px; padding: 0px;" />比如，<span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -d "user=nickwolfe&amp;password=12345" http://www.yahoo.com/login.cgi</span></span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">就相当于向这个站点发出一次登陆申请~~~~~&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">到底该用GET模式还是POST模式，要看对面服务器的程序设定。&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">一点需要注意的是，POST模式下的文件上的文件上传，比如</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">&lt;form method="POST" enctype="multipar/form-data" action="http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi"&gt;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">&lt;input type=file name=upload&gt;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">&lt;input type=submit name=nick value="go"&gt;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">&lt;/form&gt;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">这样一个HTTP表单，我们要用curl进行模拟，就该是这样的语法：</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -F upload=@localfile -F nick=go http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">罗罗嗦嗦讲了这么多，其实curl还有很多很多技巧和用法</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">比如 https的时候使用本地证书，就可以这样</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -E localcert.pem https://remote_server&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">再比如，你还可以用curl通过dict协议去查字典~~~~~</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl dict://dict.org/d:computer&nbsp;</span><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">今天为了检查所有刺猬主机上所有域名是否有备案．在使用wget不爽的情况下，找到了curl这个命令行流量器命令．发现其对post的调用还是蛮好的．特别有利于对提交信息及变&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">更参数进行较验．对于我想将几十万域名到miibeian.gov.cn进行验证是否有备案信息非常有用．发现这篇文章很不错，特为转贴．&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">我的目标：</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -d "cxfs=1&amp;ym=xieyy.cn" http://www.miibeian.gov.cn/baxx_cx_servlet&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">在出来的信息中进行过滤，提取备案号信息，并设置一个标识位．将域名，备案号及标识位入库&nbsp;</span><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">用curl命令，post提交带空格的数据&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">今天偶然遇到一个情况，我想用curl登入一个网页，无意间发现要post的数据里带空格。比如用户名为"abcdef"，密码为"abc def"，其中有一个空格，按照我以前的方式提交：&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">curl -D cookie -d "username=abcdef&amp;password=abc def" http://login.xxx.com/</span>提示登入失败。&nbsp;</span><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">于是查看curl手册man curl。找到：&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">d/--data (HTTP) Sends the speci?ed data in a POST request to the HTTP server, in a way that can emulate as if a user has ?lled in a HTML form and pressed the&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">submit button. Note that the data is sent exactly as speci?ed with no extra processing (with all newlines cut off). The data is expected to be "url-encoded".&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">This will cause curl to pass the data to the server using the content-type application/x-www-form-urlencoded. Compare to -F/--form. If this option is used&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">more than once on the same command line, the data pieces speci?ed will be merged together with a separating &amp;-letter. Thus, using &#8217;-d name=daniel -d&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">skill=lousy&#8217; would generate a post chunk that looks like &#8217;name=daniel&amp;skill=lousy&#8217;.&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">于是改用：&nbsp;</span><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #383838;">curl -D cookie -d "username=abcdef" -d "password=abc efg" http://login.xxx.com/这样就能成功登入了。&nbsp;</span></span></p>(责任编辑：飘飞的夜)</div><div style="margin: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">&nbsp;</div><div style="margin: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5;">Curl是Linux下一个很强大的http命令行工具，其功能十分强大。</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">1) 二话不说，先从这里开始吧！</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">$ curl http://www.linuxidc.com</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">回车之后，www.linuxidc.com 的html就稀里哗啦地显示在屏幕上了&nbsp;&nbsp;&nbsp;&nbsp;~</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">2) 嗯，要想把读过来页面存下来，是不是要这样呢？</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">$ curl http://www.linuxidc.com &gt; page.html</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">当然可以，但不用这么麻烦的！</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">用curl的内置option就好，存下http的结果，用这个option: -o</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">$ curl -o page.html http://www.linuxidc.com</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">这样，你就可以看到屏幕上出现一个下载页面进度指示。等进展到100%，自然就 OK咯</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">3) 什么什么？！访问不到？肯定是你的proxy没有设定了。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">使用curl的时候，用这个option可以指定http访问所使用的proxy服务器及其端口： -x</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">$ curl -x 123.45.67.89:1080 -o page.html http://www.linuxidc.com</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">4) 访问有些网站的时候比较讨厌，他使用cookie来记录session信息。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">像IE/NN这样的浏览器，当然可以轻易处理cookie信息，但我们的curl呢？.....</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">我们来学习这个option: -D &lt;&#8212; 这个是把http的response里面的cookie信息存到一个特别的文件中去</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">$ curl -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.linuxidc.com</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">这样，当页面被存到page.html的同时，cookie信息也被存到了cookie0001.txt里面了</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">5）那么，下一次访问的时候，如何继续使用上次留下的cookie信息呢？要知道，很多网站都是靠监视你的cookie信息，来判断你是不是不按规矩访问他们的网站的。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">这次我们使用这个option来把上次的cookie信息追加到http request里面去： -b</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">$ curl -x 123.45.67.89:1080 -o page1.html -D cookie0002.txt -b cookie0001.txt http://www.linuxidc.com</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">这样，我们就可以几乎模拟所有的IE操作，去访问网页了！</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">6）稍微等等&nbsp;&nbsp;&nbsp;&nbsp;~我好像忘记什么了&nbsp;&nbsp;&nbsp;&nbsp;~</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">对了！是浏览器信息</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">有些讨厌的网站总要我们使用某些特定的浏览器去访问他们，有时候更过分的是，还要使用某些特定的版本&nbsp;&nbsp;&nbsp;&nbsp;NND，哪里有时间为了它去找这些怪异的浏览器呢！？</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">好在curl给我们提供了一个有用的option，可以让我们随意指定自己这次访问所宣称的自己的浏览器信息： -A</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">$ curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.linuxidc.com</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">这样，服务器端接到访问的要求，会认为你是一个运行在Windows 2000上的 IE6.0，嘿嘿嘿，其实也许你用的是苹果机呢！</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">而"Mozilla/4.73 [en] (X11; U; Linux 2.2; 15 i686"则可以告诉对方你是一台 PC上跑着的Linux，用的是Netscape 4.73，呵呵呵</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">7）另外一个服务器端常用的限制方法，就是检查http访问的referer。比如你先访问首页，再访问里面所指定的下载页，这第二次访问的 referer地址就是第一次访问成功后的页面地址。这样，服务器端只要发现对下载页面某次访问的referer地址不是首页的地址，就可以断定那是个盗 连了&nbsp;&nbsp;&nbsp;&nbsp;~</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">讨厌讨厌 ~我就是要盗连&nbsp;&nbsp;&nbsp;&nbsp;~！！</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">幸好curl给我们提供了设定referer的option： -e</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">$ curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -e "mail.linuxidc.com" -o page.html -D cookie0001.txt http://www.linuxidc.com</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">这样，就可以骗对方的服务器，你是从mail.linuxidc.com点击某个链接过来的了，呵呵呵</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">8）写着写着发现漏掉什么重要的东西了！&#8212;&#8212;- 利用curl 下载文件</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">刚才讲过了，下载页面到一个文件里，可以使用 -o ，下载文件也是一样。比如，</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">$ curl -o 1.jpg http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">这里教大家一个新的option： -O 大写的O，这么用：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">$ curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">这样，就可以按照服务器上的文件名，自动存在本地了！</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">再来一个更好用的。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">如果screen1.JPG以外还有screen2.JPG、screen3.JPG、....、screen10.JPG需要下载，难不成还要让我们写一个script来完成这些操作？</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">不干！</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">在curl里面，这么写就可以了：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">$ curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen[1-10].JPG</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">呵呵呵，厉害吧？！ ~</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">9）再来，我们继续讲解下载！</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">$ curl -O http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">这样产生的下载，就是</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">~zzh/001.JPG</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">~zzh/002.JPG</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">...</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">~zzh/201.JPG</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">~nick/001.JPG</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">~nick/002.JPG</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">...</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">~nick/201.JPG</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">够方便的了吧？哈哈哈</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">咦？高兴得太早了。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">由于zzh/nick下的文件名都是001，002...，201，下载下来的文件重名，后面的把前面的文件都给覆盖掉了 ~</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">没关系，我们还有更狠的！</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #ff6600;">$ curl -o #2_#1.jpg http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">&#8212;这是.....自定义文件名的下载？ &#8212;对头，呵呵！</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">这样，自定义出来下载下来的文件名，就变成了这样：原来： ~zzh/001.JPG &#8212;-&gt; 下载后： 001-zzh.JPG 原来： ~nick/001.JPG &#8212;-&gt; 下载后： 001-nick.JPG</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5;">这样一来，就不怕文件重名啦，呵呵</p></div><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">完</p><img src ="http://www.blogjava.net/czihong/aggbug/399038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-05-09 11:52 <a href="http://www.blogjava.net/czihong/articles/399038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Web Application 远程调试</title><link>http://www.blogjava.net/czihong/articles/398812.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Sun, 05 May 2013 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/398812.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/398812.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/398812.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/398812.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/398812.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">最近在开发java web application的时候，因为很多原因，无法对自己开发的项目在本地进行调试，常常需要进行远程调试，之前一直通过打logger的方式进行，每次都要重新部署，相当的痛苦，今天下午研究了以下，如果进行远程调试。<br /><br />开发的web application是部署在tomcat上面的，那么问题就转化为如何调试tomcat。其实调试tomcat，本质上就是调试JVM。JVM的强大，从J2SE1.4.2开始，就实现了JPDA （Java Platform Debug Architecture）。<br /><br />tomcat默认情况下，是没有启用jpda的，如果要启用，需要传入参数<br /><strong><span style="text-decoration: underline;">-Xdebug -Xrunjdwp:transport=dt_socket, address=8000,server=y,suspend=y</span></strong><br /><br />那么问题是这些参数如何在tomcat启动的使用传入呢？这是时候，需要了解tomcat的启动脚本，在TOMCAT_HOME/bin</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">目录下，有三个脚本catalina.sh, startup.sh, 和 shutdown.sh。如果查看startup.sh和shutdown.sh，都是通过catalina.sh来启动的。脚本如下：<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->EXECUTABLE=catalina.sh<br /><br />exec&nbsp;"$PRGDIR"/"$EXECUTABLE"&nbsp;start&nbsp;"$@"</div>于是，我们可以查看下catalina.sh的脚本是如何实现的。<br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><div># &nbsp; JPDA_TRANSPORT &nbsp;(Optional) JPDA transport used when the "jpda start"</div><div># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; command is executed. The default is "dt_socket".</div><div>#</div><div># &nbsp; JPDA_ADDRESS &nbsp; &nbsp;(Optional) Java runtime options used when the "jpda start"</div><div># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; command is executed. The default is 8000.</div><div>#</div><div># &nbsp; JPDA_SUSPEND &nbsp; &nbsp;(Optional) Java runtime options used when the "jpda start"</div><div># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; command is executed. Specifies whether JVM should suspend</div><div># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; execution immediately after startup. Default is "n".</div><div>#</div><div># &nbsp; JPDA_OPTS &nbsp; &nbsp; &nbsp; (Optional) Java runtime options used when the "jpda start"</div><div># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS,</div><div># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; and JPDA_SUSPEND are ignored. Thus, all required jpda</div><div># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; options MUST be specified. The default is:</div><div>#</div><div># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -agentlib:jdwp=transport=$JPDA_TRANSPORT,</div><div># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND</div><div><br /><div></div><div>if [ "$1" = "jpda" ] ; then</div><div>&nbsp; if [ -z "$JPDA_TRANSPORT" ]; then</div><div>&nbsp; &nbsp; JPDA_TRANSPORT="dt_socket"</div><div>&nbsp; fi &nbsp;</div><div>&nbsp; if [ -z "$JPDA_ADDRESS" ]; then</div><div>&nbsp; &nbsp; JPDA_ADDRESS="8000"</div><div>&nbsp; fi &nbsp;</div><div>&nbsp; if [ -z "$JPDA_SUSPEND" ]; then</div><div>&nbsp; &nbsp; JPDA_SUSPEND="n"</div><div>&nbsp; fi &nbsp;</div><div>&nbsp; if [ -z "$JPDA_OPTS" ]; then</div><div>&nbsp; &nbsp; JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"</div><div>&nbsp; fi &nbsp;</div><div>&nbsp; CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS"</div><div>&nbsp; shift</div><div>fi</div><div style="display: inline-block;"><div></div></div></div></div><br />通过这个代码，我们可以看出，其实要启动jpda, 最主要的是要对JPDA_SUSPEND的值进行设置，由N改为Y。<br /><br />借鉴start.sh的启动，在linux下，我们可以自己创建一个jpda.sh的脚本，用来启动开启debug模式的tomcat，具体脚本如下，黑体为修改部分。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->os400=<span style="color: #0000FF; ">false</span><br />darwin=<span style="color: #0000FF; ">false</span><br /><span style="color: #0000FF; ">case</span>&nbsp;"`uname`"&nbsp;in<br />CYGWIN*)&nbsp;cygwin=<span style="color: #0000FF; ">true</span>;;<br />OS400*)&nbsp;os400=<span style="color: #0000FF; ">true</span>;;<br />Darwin*)&nbsp;darwin=<span style="color: #0000FF; ">true</span>;;<br />esac<br /><br />#&nbsp;resolve&nbsp;links&nbsp;-&nbsp;$0&nbsp;may&nbsp;be&nbsp;a&nbsp;softlink<br />PRG="$0"<br /><br /><span style="color: #0000FF; ">while</span>&nbsp;[&nbsp;-h&nbsp;"$PRG"&nbsp;]&nbsp;;&nbsp;<span style="color: #0000FF; ">do</span><br />&nbsp;&nbsp;ls=`ls&nbsp;-ld&nbsp;"$PRG"`<br />&nbsp;&nbsp;link=`expr&nbsp;"$ls"&nbsp;:&nbsp;'.*-&gt;&nbsp;\(.*\)$'`<br />&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;expr&nbsp;"$link"&nbsp;:&nbsp;'/.*'&nbsp;&gt;&nbsp;/dev/<span style="color: #0000FF; ">null</span>;&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;PRG="$link"<br />&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;PRG=`dirname&nbsp;"$PRG"`/"$link"<br />&nbsp;&nbsp;fi<br />done<br />&nbsp;<br />PRGDIR=`dirname&nbsp;"$PRG"`<br />EXECUTABLE=catalina.sh<br /><br />#&nbsp;Check&nbsp;that&nbsp;target&nbsp;executable&nbsp;exists<br /><span style="color: #0000FF; ">if</span>&nbsp;$os400;&nbsp;then<br />&nbsp;&nbsp;#&nbsp;-x&nbsp;will&nbsp;Only&nbsp;work&nbsp;on&nbsp;the&nbsp;os400&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;the&nbsp;files&nbsp;are:&nbsp;<br />&nbsp;&nbsp;#&nbsp;1.&nbsp;owned&nbsp;by&nbsp;the&nbsp;user<br />&nbsp;&nbsp;#&nbsp;2.&nbsp;owned&nbsp;by&nbsp;the&nbsp;PRIMARY&nbsp;group&nbsp;of&nbsp;the&nbsp;user<br />&nbsp;&nbsp;#&nbsp;<span style="color: #0000FF; ">this</span>&nbsp;will&nbsp;not&nbsp;work&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;the&nbsp;user&nbsp;belongs&nbsp;in&nbsp;secondary&nbsp;groups<br />&nbsp;&nbsp;eval<br /><span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;[&nbsp;!&nbsp;-x&nbsp;"$PRGDIR"/"$EXECUTABLE"&nbsp;];&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Cannot&nbsp;find&nbsp;$PRGDIR/$EXECUTABLE"<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"The&nbsp;file&nbsp;is&nbsp;absent&nbsp;or&nbsp;does&nbsp;not&nbsp;have&nbsp;execute&nbsp;permission"<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"This&nbsp;file&nbsp;is&nbsp;needed&nbsp;to&nbsp;run&nbsp;this&nbsp;program"<br />&nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;1<br />&nbsp;&nbsp;fi<br />fi&nbsp;<br /><br /><strong>export&nbsp;JPDA_SUSPEND=y</strong><br /><br />exec&nbsp;"$PRGDIR"/"$EXECUTABLE"&nbsp;<strong>jpda&nbsp;start</strong>&nbsp;"$@"</div><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong>在Eclipse中远程调试Tomcat</strong></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">首先将Tomcat 5.5.26的源代码分为container connectors jasper servletapi build五个项目，导入到Eclipse中。启动相关的代码主要在container中，就以它为当前项目，打开&#8221;Debug Configurations&#8220;对话框。</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">然后创建一个&#8221;Remote Java Application&#8220;，Connection Type选择&#8221;Standard (Socket Attach)&#8220;，Host填写localhost（Tomcat所在的主机地址），Port填写8000。最后点击&#8221;Apply&#8220;保存。</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><img src="http://hi.csdn.net/attachment/201001/24/49338_1264334380iDG5.jpg" alt="Eclipse的Debug Configurations对话框中配置远程调试" width="793" height="525" style="border: none;" /></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">首先确保已经执行了jpda.bat，Tomcat正在等待调试器连接；然后执行上述的Debug Configuration，Eclipse就可以连上Tomcat。</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">Tomcat的启动是从Bootstrap的main方法开始，我在第一行代码处设置了断点，Tomcat的启动就停在了这一行：</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><img src="http://hi.csdn.net/attachment/201001/24/49338_1264335021XUuZ.jpg" alt="断点调试Tomcat的启动过程" width="932" height="569" style="border: none;" /></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">接着，让Tomcat继续执行，我们可以看到，控制台输出了启动信息。</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><img src="http://hi.csdn.net/attachment/201001/24/49338_1264335334QJ8n.jpg" alt="Tomcat在JPDA模式下继续启动" width="661" height="530" style="border: none;" /></p><img src ="http://www.blogjava.net/czihong/aggbug/398812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-05-05 16:49 <a href="http://www.blogjava.net/czihong/articles/398812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring mvc singleton的验证</title><link>http://www.blogjava.net/czihong/articles/398806.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Sun, 05 May 2013 05:49:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/398806.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/398806.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/398806.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/398806.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/398806.html</trackback:ping><description><![CDATA[用了Spring MVC有一个多月了，之前虽然有接触过一些，但是一直没有在实际工作中使用。今天和同事聊起，谈到Spring MVC中的Controller是单例实现的，于是就写了一段代码验证一些。<br /><br />1. 如果是单例的，那么在Controller类中的实例变量应该是共享的，如果不共享，则说明不是单例。<br />直接代码：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Controller<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;DemoAction&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;&nbsp;i&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/singleton")<br />&nbsp;&nbsp;&nbsp;&nbsp;@ResponseBody<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;singleton(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;InterruptedException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;addInt&nbsp;=&nbsp;Integer.parseInt(request.getParameter("int"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;i&nbsp;+&nbsp;addInt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;String.valueOf(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br />分别三次请求： localhost：8080/projectname/singleton？int=5<br />得到的返回结果如下。<br />第一次： i=5<br />第二次： i=10<br />第三次： i=15<br /><br />重结果可以得知，i的状态是共享的，因此Controller是单例的。<br /><br />-------------------------------------------------------------------------------------------------------------------------<br />2. 如果是单例，那么多个线程请求同一个Controller类中的同一个方法，线程是否会堵塞？<br />验证代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp; @RequestMapping(value&nbsp;=&nbsp;"/switcher")<br />&nbsp;&nbsp;&nbsp;&nbsp;@ResponseBody<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;switcher(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;InterruptedException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;switcher&nbsp;=&nbsp;request.getParameter("switcher");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(switcher.equals("on"))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.currentThread().sleep(10000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"switch&nbsp;on";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;switcher;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><br />验证方法：<br />分别发送两个请求，<br />第一个请求：localhost：8080/projectname/singleton？switcher=on<br />第二个请求：localhost：8080/projectname/singleton？switcher=everything<br /><br />验证结果：<br />第一个请求发出去以后，本地服务器等待10s，然后返回结果&#8220;switch on&#8221;,<br />在本地服务器等待的者10s当中，第二期的请求，直接返回结果&#8220;everything&#8221;。说明之间的线程是不互相影响的。<br />-------------------------------------------------------------------------------------------------------------------------<br />3.既然Controller是单例的，那么Service是单例的吗？验证方法和Controller的单例是一样的。<br />验证代码：<br />Controller:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><div style="display: inline-block;">@Controller<br /><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">class</span>&nbsp;DemoAction&nbsp;{<br /><br /><div>&nbsp;&nbsp;&nbsp;&nbsp;@Resource</div><div>&nbsp;&nbsp;&nbsp;&nbsp;private DemoService demoService;</div><br />&nbsp;&nbsp;&nbsp;&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/service")<br />&nbsp;&nbsp;&nbsp;&nbsp;@ResponseBody<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">public</span>&nbsp;String&nbsp;service(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">throws</span>&nbsp;InterruptedException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">int</span>&nbsp;result&nbsp;=&nbsp;demoService.addService(5);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span>&nbsp;String.valueOf(result);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div>&nbsp; &nbsp;&nbsp;</div>Service:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Service<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;DemoService&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;addService(<span style="color: #0000FF; ">int</span>&nbsp;num){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;i&nbsp;+&nbsp;num;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br />分别三次请求： localhost：8080/projectname/service<br />得到的返回结果如下。<br />第一次： i=5<br />第二次： i=10<br />第三次： i=15<br /><br />重结果可以得知，i的状态是共享的，因此Service默认是单例的。<br />-------------------------------------------------------------------------------------------------------------------------<br />相同的验证方法，可以得出@Repository的DAO也是默认单例。<br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/czihong/aggbug/398806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-05-05 13:49 <a href="http://www.blogjava.net/czihong/articles/398806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java MVC 比较</title><link>http://www.blogjava.net/czihong/articles/398790.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Sat, 04 May 2013 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/398790.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/398790.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/398790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/398790.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/398790.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Spring MVC&nbsp;PK&nbsp;Struts2我们用struts2时采用的传统的配置文件的方式，并没有使用传说中的0配置。spring3 mvc可以认为已经100%零配置了（除了配置spring mvc-servlet.xml外）。Spring MVC和Struts2的区别：1. 机制：spring mvc的入口是servlet，而struts2是filter（...&nbsp;&nbsp;<a href='http://www.blogjava.net/czihong/articles/398790.html'>阅读全文</a><img src ="http://www.blogjava.net/czihong/aggbug/398790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-05-04 16:21 <a href="http://www.blogjava.net/czihong/articles/398790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计算500万PV/每天的网站</title><link>http://www.blogjava.net/czihong/articles/398789.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Sat, 04 May 2013 08:00:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/398789.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/398789.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/398789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/398789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/398789.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">Refer to:&nbsp;</span><a href="http://elf8848.iteye.com/blog/967049">http://elf8848.iteye.com/blog/967049</a><br /><span style="font-size: medium;">你想建设一个能承受500万PV/每天的网站吗？ 500万PV是什么概念？服务器每秒要处理多少个请求才能应对？如果计算呢？&nbsp;<br /><br /><strong>PV是什么：</strong></span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">PV是page view的简写。PV是指页面的访问次数，每</span><span style="font-size: medium;">打开或刷新</span><span style="font-size: medium;">一次页面，就算做一个pv。&nbsp;<br /><br /><strong>计算模型：&nbsp;</strong><br />每台服务器每秒处理请求的数量=((80%*总PV量)/(24小时*60分*60秒*40%)) / 服务器数量 。<br />其中关键的参数是80%、40%。表示一天中有80%的请求发生在一天的40%的时间内。24小时的40%是9.6小时，有80%的请求发生一天的9.6个小时当中（很适合互联网的应用，白天请求多，晚上请求少）。&nbsp;<br /></span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;"><strong>简单计算的结果：</strong><br />((80%*500万)/(24小时*60分*60秒*40%))/1 = 115.7个请求/秒&nbsp;<br />((80%*100万)/(24小时*60分*60秒*40%))/1 = 23.1个请求/秒&nbsp;<br /><br /><strong>初步结论：</strong>&nbsp;<br />现在我们在做压力测试时，就有了标准，如果你的服务器一秒能处理115.7个请求，就可以承受500万PV/每天。如果你的服务器一秒能处理23.1个请求，就可以承受100万PV/每天</span><span style="font-size: medium;">。</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;"><strong>留足余量：</strong></span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">以上请求数量</span><span style="font-size: medium;">是</span><span style="font-size: medium;">均匀的分布在白天的9.6个小时中，但实际情况并不会这么均匀的分布，会有高峰有低谷。为了应对高峰时段，</span><span style="font-size: medium;">应该留一些余地，最少也要x2倍，x3倍也不为过。</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">115.7个请求/秒&nbsp;*2倍=231.4</span><span style="font-size: medium;">个请求/秒</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">115.7个请求/秒&nbsp;*3</span><span style="font-size: medium;">倍</span><span style="font-size: medium;">=347.1</span><span style="font-size: medium;">个请求/秒</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">23.1个请求/秒&nbsp;*2</span><span style="font-size: medium;">倍</span><span style="font-size: medium;">=46.2</span><span style="font-size: medium;">个请求/秒</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">23.1个请求/秒&nbsp;*3</span><span style="font-size: medium;">倍</span><span style="font-size: medium;">=</span><span style="font-size: medium;">69.3</span><span style="font-size: medium;">个请求/秒</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><strong style="font-size: medium;">最终结论：</strong></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">如果你的服务器一秒能处理</span><span style="font-size: medium;">231.4--</span><span style="font-size: medium;">347.1</span><span style="font-size: medium;">个请求/秒</span><span style="font-size: medium;">，就可以应对平均500万PV/每天。</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">如果你的服务器一秒能处理</span><span style="font-size: medium;">46.2--</span><span style="font-size: medium;">69.3</span><span style="font-size: medium;">个请求，就可以</span><span style="font-size: medium;">应对平均100万PV/每天</span><span style="font-size: medium;">。</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;"><strong>说明：</strong></span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">这里说明每秒N个请求，就是QPS。因为我关心的是应用程序处理业务的能力。&nbsp;</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;"><strong>实际经验：</strong></span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">1、根据实际经验，采用两台常规配置的机架式服务器，配置是很常见的配置，例如一个4核CPU+4G内存+服务器SAS硬盘</span><span style="font-size: medium;">。</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">2、个人武断的认为在服务器CPU领域Intel的CPU要优于AMD</span><span style="font-size: medium;">的CPU</span><span style="font-size: medium;">，有反对的就反对吧，我都说我武断了（请看</span><a href="http://elf8848.iteye.com/blog/710950" style="color: #108ac6; font-size: medium;">CPU性能比较</a><span style="font-size: medium;">），不要太相信AMD的广告，比较CPU性能简单办法就是比价格，不要比频率与核心数，价格相差不多的性能也相差不多。</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">3、硬盘的性能很重要，由其是数据库服务器。一般的服务器都配</span><span style="font-size: medium;">1.5万转的SAS硬盘，高级一点的可以配SSD固态硬盘，性能会更好。最最最最重要的指标是&#8220;随机读写性能&#8221;而不是&#8220;顺序读写性能&#8221;。（本例还是配置最常见的</span><span style="font-size: medium;">1.5万转的SAS硬盘吧</span><span style="font-size: medium;">）</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">4、一台服务器跑Tomcat运行j2ee程序,一台服务器跑MySql数据库,程序写的中等水平(这个真的不好量化)，是</span><span style="font-size: medium;">论坛类型的应用(总有回帖,不太容易做缓存,也无法静态化)。</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">5、以上软硬件情况下，是可以承受100万PV/每天的。(已留有余量应对突然的访问高峰)</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;"><strong>注意机房的网络带宽：</strong></span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">有人说以上条件我都满足了，但实际性能还是达不到目标。这时请注意你对外的网络的带宽，在国内服务器便宜但带宽很贵，很可能你在机房是与大家共享一条100M的光纤，实际每个人可分到2M左右带宽。再好一点5M,再好一点双线机房10M独享，这已经</span><span style="font-size: medium;">很贵</span><span style="font-size: medium;">了（北京价格）。</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: small;"><span style="font-size: medium;">一天总流量：每个页面20k字节*100万个页面/1024=19531M字节=19G字节，</span></span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: small;"><span style="font-size: medium;">19531M/9.6小时=2034M/小时=578K字节/s &nbsp; 如果请求是均匀分布的，需要5M</span></span><span style="font-size: small;">（</span><span style="font-size: medium;">640K字节</span><span style="font-size: medium;">）</span><span style="font-size: medium;">带宽（5Mb=640KB 注意大小写，b是位，B是字节，差了8倍）</span><span style="font-size: medium;">，但所有请求不可能是均匀分布的，当有高峰时5M带宽一定不够，X2倍就是10M带宽。</span><span style="font-size: medium;">10M带宽</span><span style="font-size: medium;">基本可以满足要求。</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">以上是假设每个页面20k字节，基本不包含图片，要是</span><span style="font-size: medium;">包含</span><span style="font-size: medium;">图片就更大了，10M</span><span style="font-size: medium;">带宽</span><span style="font-size: medium;">也不能满足要求了。你自已计算吧。</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;">（全文完）</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;"><strong>附：性能测试基本概念</strong><br />---------------------------------------------------------------------------------------&nbsp;<br /><strong>基本概念：</strong>&nbsp;<br />Throughput（吞吐量）：按照常规理解网络吞吐量表示在单位时间内通过网卡数据量之和，其中即包括本机网卡发送出去的数据量也包括本机网卡接收到的数据量。 一个100Mb(位)的双工网卡，最大发送数据的速度是12.5M字节/s ，</span>&nbsp;<span style="font-size: medium;">最大接收数据的速度是12.5M字节/s，</span>&nbsp;<span style="font-size: medium;">可以</span>&nbsp;<strong><span style="font-size: medium;">同时</span>&nbsp;<span style="font-size: medium;">收发</span>&nbsp;</strong><span style="font-size: medium;">数据。&nbsp;</span><br /><span style="font-size: medium;">并发用户数：是同时执行操作的用户(线程数)。&nbsp;<br />响应时间：从请求发出到收到响应花费的时间 。</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="font-size: medium;"><br />QPS&nbsp;</span><span style="font-size: medium;">- Queries Per Second&nbsp;&nbsp;</span><span style="font-size: medium;">每秒处理的查询数（如果是数据库，就相当于读取）<br />TPS&nbsp;</span><span style="font-size: medium;">- Transactions Per Second&nbsp;&nbsp;</span><span style="font-size: medium;">每秒处理的事务数(如果是数据库，就相当于写入、修改)<br />IOPS，每秒磁盘进行的I/O操作次数<br /><br />例如对某个数据库测试，分开两次测QPS与TPS。<br />QPS（读取）值总是高于TPS(写、改)，并且有倍率关系，因为：<br />1、数据库对查询可能有缓存。<br />2、机械硬盘或SSD硬盘的读就是比写快。</span>&nbsp;<span style="font-size: medium;"><br />---------------------------------------------------------------------------------------&nbsp;<br /><strong>JMeter测试参数说明：</strong>&nbsp;<br /><br />Label：每一个测试单元的名字。&nbsp;<br /><br />#Samples：表示一个测试单元一共发出了多少个请求。&nbsp;<br /><br />Average：平均响应时间&#8212;&#8212;默认情况下是单个 Request 的平均响应时间，当使用了 Transaction Controller 时，也可以以Transaction 为单位显示平均响应时间。，不重要。&nbsp;<br /><br />Median：中位数，也就是 50％ 用户的响应时间，如果把响应时间从小到大顺序排序，那么50％的请求的响应时间在这个范围之内。重要。&nbsp;<br /><br />90% Line：90％ 用户的响应时间，如果把响应时间从小到大顺序排序，那么90％的请求的响应时间在这个范围之内。<span style="color: #ff0000;">重要</span>&nbsp;。&nbsp;<br /><br />Min：最小响应时间，不重要。&nbsp;<br /><br />Max：最大响应时间，出现几率只不过是千分之一甚至万分之一，不重要。&nbsp;<br /><br />Error%：本次测试中出现错误的请求的数量&nbsp;<br /><br />Throughput：吞吐量&#8212;&#8212;默认情况下表示每秒完成的请求数（Request per Second），当使用了 Transaction Controller 时，也可以表示类似 LoadRunner 的 Transaction per Second 数&nbsp;<br /><br />KB/Sec：每秒从服务器端<span style="color: #ff0000;">接收</span>&nbsp;到的数据量(只是接收)，相当于LoadRunner中的Throughput/Sec&nbsp;<br />---------------------------------------------------------------------------------------&nbsp;<br /><strong>loadrunner测试参数说明：</strong>&nbsp;<br /><br /><strong>响应时间：</strong>&nbsp;取90%值，如果把响应时间从小到大顺序排序，那么90％的请求的响应时间在这个范围之内。重要。&nbsp;<br /><br /><strong>每秒点击数</strong>&nbsp;：hits per Second,每秒钟向服务器提交请求的数量。&nbsp;<br /><br /><strong>TPS：</strong>&nbsp;Transaction per Second ，每秒事务数，一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程&nbsp;<br /><br /><strong>Throughput（吞吐量）：</strong>&nbsp;Loadrunner记录的Throughput是接收到服务器返回的所有字节数之和，与本地发出的字节数无关。&nbsp;<br /><br /><strong>Throughput/Sec：</strong>&nbsp;每秒的吞吐量。&nbsp;<br /><br />对于BS架构的一般分析 响应时间、点击率、吞吐量、TPS（每秒事务数）。&nbsp;<br />对于CS架构的一般分析 TPS（每秒事务数）&nbsp;</span></p><img src ="http://www.blogjava.net/czihong/aggbug/398789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-05-04 16:00 <a href="http://www.blogjava.net/czihong/articles/398789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>