﻿<?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-听风流过</title><link>http://www.blogjava.net/tingfeng/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 20:07:26 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 20:07:26 GMT</pubDate><ttl>60</ttl><item><title>vscode调试go程序</title><link>http://www.blogjava.net/tingfeng/articles/435796.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Sun, 07 Feb 2021 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/435796.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/435796.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/435796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/435796.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/435796.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">随着互联网时代的飞速发展，我们编码使用的开发利器也在不断更新换代，古话说工欲善其事必先利其器。对于Go语言程序的开发者而言，当下最火的IDE应该非微软的Visual Studio Code莫属，下面给出怎样在vscode中调试go程序的过程，以mac本为示例。<br />
当前已经准备好go的待调试代码，main.go的函数位置为：<br />
</span>
<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 />
-->/Users/tingfeng/Workspace/go/src/github.com/nsharecome/caccount/main.go</div>
<span style="color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;"><br />
1、编辑launch.json文件<br /></span><img src="data:image/png;base64,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" alt="" /><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 />
-->{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;使用&nbsp;IntelliSense&nbsp;了解相关属性。&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;悬停以查看现有属性的描述。<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;欲了解更多信息，请访问:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">https://go.microsoft.com/fwlink/?linkid=830387</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;"version":&nbsp;"0.2.0",<br />
&nbsp;&nbsp;&nbsp;&nbsp;"configurations":&nbsp;[<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"name":&nbsp;"debug",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"type":&nbsp;"go",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"request":&nbsp;"launch",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"mode":&nbsp;"debug",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"port":&nbsp;8899,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"host":&nbsp;"127.0.0.1",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"program":&nbsp;"/Users/tingfeng/Workspace/go/src/github.com/nsharecome/caccount/main.go",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"env":&nbsp;{},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"args":&nbsp;[&nbsp;&nbsp;&nbsp;&nbsp;],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"output":&nbsp;"${workspaceRoot}/bin/debug_caccount",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"showLog":&nbsp;<span style="color: #0000FF; ">true</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;]<br />
}</div>
<br />
<span style="color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">2、点击运行，报错如下：<br />
</span>
<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 />
-->2021/02/07&nbsp;16:51:52&nbsp;/Users/tingfeng/Workspace/go/src/github.com/nsharecome/caccount/main.go/debugger.go:101:&nbsp;launching&nbsp;process&nbsp;with&nbsp;args:&nbsp;[/Users/tingfeng/Workspace/go/src/github.com/nsharecome/caccount/bin/debug_caccount]<br />
could&nbsp;not&nbsp;launch&nbsp;process:&nbsp;decoding&nbsp;dwarf&nbsp;section&nbsp;info&nbsp;at&nbsp;offset&nbsp;0x0:&nbsp;too&nbsp;<span style="color: #0000FF; ">short</span><br />
Process&nbsp;exiting&nbsp;with&nbsp;code:&nbsp;1</div>
<span style="color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;"><br />
错误原因如下：<a href="https://blog.csdn.net/u011561335/article/details/105193342" title="安装delve">安装delve</a></span><br />
<span style="color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">解决方式：<br />
</span>
<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 />
-->git&nbsp;clone&nbsp;https:<span style="color: #008000; ">//</span><span style="color: #008000; ">github.com/go-delve/delve.git&nbsp;$GOPATH/src/github.com/go-delve/delve</span><span style="color: #008000; "><br />
</span>go&nbsp;get&nbsp;-u&nbsp;github.com/derekparker/delve/cmd/dl</div>
<span style="color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;"><br />利用delve手动调试可以参考：<a href="https://chai2010.cn/advanced-go-programming-book/ch3-asm/ch3-09-debug.html" title="Delve调试器">Delve调试器</a><br />
</span><span style="color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;"><br />
<br />
<br />
</span><img src ="http://www.blogjava.net/tingfeng/aggbug/435796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2021-02-07 16:58 <a href="http://www.blogjava.net/tingfeng/articles/435796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>fabric CouchDB使用-marbles链码码翻译</title><link>http://www.blogjava.net/tingfeng/articles/434998.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Fri, 27 Dec 2019 09:18:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/434998.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/434998.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/434998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/434998.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/434998.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 源码关键代码梳理创建索引Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->//&nbsp;&nbsp;====&nbsp;创建颜色的索引&nbsp;====&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;索引是一个状态数据库中...&nbsp;&nbsp;<a href='http://www.blogjava.net/tingfeng/articles/434998.html'>阅读全文</a><img src ="http://www.blogjava.net/tingfeng/aggbug/434998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2019-12-27 17:18 <a href="http://www.blogjava.net/tingfeng/articles/434998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hyperledger Fabric1.4环境搭建</title><link>http://www.blogjava.net/tingfeng/articles/434990.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Thu, 26 Dec 2019 00:57:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/434990.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/434990.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/434990.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/434990.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/434990.html</trackback:ping><description><![CDATA[<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">简单记录一下fabric版本1.4的环境搭建，运行环境为Ubuntu18.04，其中一些内容是根据官方文档整理的，如有错误欢迎批评指正。<br style="margin: 0px; padding: 0px;" />本文只介绍最简单的环境搭建方法，具体的环境搭建解析在这里<a href="https://ifican.top/2019/11/23/blog/fabric/%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90Fabric%E6%90%AD%E5%BB%BA%E7%9A%84%E5%85%A8%E8%BF%87%E7%A8%8B/" style="margin: 0px; padding: 0px; color: #000000;">深入解析Hyperledger Fabric启动的全过程</a><br style="margin: 0px; padding: 0px;" />。</p><h2>1.搭建Fabric的前置条件</h2><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">为了提高下载速度，这里将Ubuntu的源改为国内的源(以阿里源为例)：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code awk"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;"><span style="margin: 0px; padding: 0px; color: #008000;">#首先进行配置文件的备份</span> sudo cp <span style="margin: 0px; padding: 0px;">/etc/</span>apt<span style="margin: 0px; padding: 0px;">/sources.list /</span>etc<span style="margin: 0px; padding: 0px;">/apt/</span>sources.list.bak <span style="margin: 0px; padding: 0px; color: #008000;">#编辑配置文件</span> sudo vim <span style="margin: 0px; padding: 0px;">/etc/</span>apt<span style="margin: 0px; padding: 0px;">/sources.list</span></code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">在配置文件中开头添加以下内容(阿里源)：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code groovy"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">deb <span style="margin: 0px; padding: 0px; color: #a31515;">http:</span><span style="margin: 0px; padding: 0px; color: #008000;">//mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse</span> deb <span style="margin: 0px; padding: 0px; color: #a31515;">http:</span><span style="margin: 0px; padding: 0px; color: #008000;">//mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse</span> deb <span style="margin: 0px; padding: 0px; color: #a31515;">http:</span><span style="margin: 0px; padding: 0px; color: #008000;">//mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse</span> deb <span style="margin: 0px; padding: 0px; color: #a31515;">http:</span><span style="margin: 0px; padding: 0px; color: #008000;">//mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse</span> deb <span style="margin: 0px; padding: 0px; color: #a31515;">http:</span><span style="margin: 0px; padding: 0px; color: #008000;">//mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse</span> deb-src <span style="margin: 0px; padding: 0px; color: #a31515;">http:</span><span style="margin: 0px; padding: 0px; color: #008000;">//mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse</span> deb-src <span style="margin: 0px; padding: 0px; color: #a31515;">http:</span><span style="margin: 0px; padding: 0px; color: #008000;">//mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse</span> deb-src <span style="margin: 0px; padding: 0px; color: #a31515;">http:</span><span style="margin: 0px; padding: 0px; color: #008000;">//mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse</span> deb-src <span style="margin: 0px; padding: 0px; color: #a31515;">http:</span><span style="margin: 0px; padding: 0px; color: #008000;">//mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse</span> deb-src <span style="margin: 0px; padding: 0px; color: #a31515;">http:</span><span style="margin: 0px; padding: 0px; color: #008000;">//mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse</span></code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">执行命令更新一下：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code sql"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">sudo apt-get <span style="margin: 0px; padding: 0px; color: #0000ff;">update</span> sudo apt-<span style="margin: 0px; padding: 0px; color: #0000ff;">get</span> <span style="margin: 0px; padding: 0px; color: #0000ff;">upgrade</span></code></pre><h3>1.1安装GOLANG</h3><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">首先需要安装一些必要的依赖：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code cmake"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">sudo apt <span style="margin: 0px; padding: 0px; color: #0000ff;">install</span> libtool libltdl-dev</code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">国内GO语言安装包的下载地址为:<br style="margin: 0px; padding: 0px;" /><code style="margin: 1px 5px; padding: 0px 5px !important; line-height: 1.8; vertical-align: middle; display: inline-block; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; background-color: #f5f5f5 !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">https://studygolang.com/dl</code><br style="margin: 0px; padding: 0px;" />本文中下载了<code style="margin: 1px 5px; padding: 0px 5px !important; line-height: 1.8; vertical-align: middle; display: inline-block; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; background-color: #f5f5f5 !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">go1.12.5.linux-amd64.tar.gz</code>到Ubuntu系统中。<br style="margin: 0px; padding: 0px;" />将压缩包复制到<code style="margin: 1px 5px; padding: 0px 5px !important; line-height: 1.8; vertical-align: middle; display: inline-block; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; background-color: #f5f5f5 !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">/usr/local</code>路径下,执行以下命令进行解压：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code nginx"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;"><span style="margin: 0px; padding: 0px; color: #a31515;">cd</span> /usr/local tar zxvf go<span style="margin: 0px; padding: 0px;">*.tar.gz</span></code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">接下来配置GO的环境变量：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code nginx"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;"><span style="margin: 0px; padding: 0px; color: #a31515;">sudo</span> vim ~/.profile</code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">在文本中添加以下内容:</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code bash"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;"><span style="margin: 0px; padding: 0px; color: #0000ff;">export</span> PATH=<span style="margin: 0px; padding: 0px; color: #008000;">$PATH</span>:/usr/<span style="margin: 0px; padding: 0px; color: #0000ff;">local</span>/go/bin <span style="margin: 0px; padding: 0px; color: #0000ff;">export</span> GOROOT=/usr/<span style="margin: 0px; padding: 0px; color: #0000ff;">local</span>/go <span style="margin: 0px; padding: 0px; color: #0000ff;">export</span> GOPATH=<span style="margin: 0px; padding: 0px; color: #008000;">$HOME</span>/go <span style="margin: 0px; padding: 0px; color: #0000ff;">export</span> PATH=<span style="margin: 0px; padding: 0px; color: #008000;">$PATH</span>:<span style="margin: 0px; padding: 0px; color: #008000;">$GOPATH</span>/bin</code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">执行命令：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code r"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;"><span style="margin: 0px; padding: 0px; color: #0000ff;">source</span> ~/.profile go version</code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">如果可以看到GO的版本信息，说明GO已经安装完成。</p><h3>1.2安装Docker</h3><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">在这里，我们可以使用阿里云的镜像地址安装Docker。<br style="margin: 0px; padding: 0px;" /><strong style="margin: 0px; padding: 0px;">如果Ubuntu系统中有旧版本的Docker，需要卸载后重新安装。</strong>可以使用以下命令进行卸载：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code lua"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">sudo apt-get <span style="margin: 0px; padding: 0px; color: #0000ff;">remove</span> docker \              docker-engine \              docker.<span style="margin: 0px; padding: 0px; color: #0000ff;">io</span></code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">然后执行以下命令安装Docker：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code dockerfile"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;"><span style="margin: 0px; padding: 0px; color: #008000;"># step 1: 安装必要的一些系统工具</span> sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common <span style="margin: 0px; padding: 0px; color: #008000;"># step 2:安装GPG证书：</span> curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key <span style="margin: 0px; padding: 0px; color: #0000ff;">add</span><span style="margin: 0px; padding: 0px;"> - </span><span style="margin: 0px; padding: 0px; color: #008000;"># step 3:写入软件源信息</span> sudo <span style="margin: 0px; padding: 0px; color: #0000ff;">add</span><span style="margin: 0px; padding: 0px;">-apt-repository <span style="margin: 0px; padding: 0px; color: #a31515;">"deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu <span style="margin: 0px; padding: 0px; color: #008000;">$(lsb_release -cs)</span> stable"</span> </span><span style="margin: 0px; padding: 0px; color: #008000;"># step 4:更新并安装Docker-CE</span> sudo apt-get -y update sudo apt-get -y install docker-ce  <span style="margin: 0px; padding: 0px; color: #008000;">###参考 https://help.aliyun.com/document_detail/60742.html</span></code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">将当前用户添加到Docker用户组：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code awk"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;"><span style="margin: 0px; padding: 0px; color: #008000;"># step 1: 创建docker用户组</span> sudo groupadd docker <span style="margin: 0px; padding: 0px; color: #008000;"># step 2:将当前用户添加到docker用户组</span> sudo usermod -aG docker <span style="margin: 0px; padding: 0px; color: #008000;">$USER</span> <span style="margin: 0px; padding: 0px; color: #008000;">#退出当前终端</span> <span style="margin: 0px; padding: 0px; color: #0000ff;">exit</span></code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">将docker镜像更改为阿里云的地址：<br style="margin: 0px; padding: 0px;" /><strong style="margin: 0px; padding: 0px;">这一步只限Ubuntu16.04+,Debian8+,CentOS 7的系统。</strong><br style="margin: 0px; padding: 0px;" />编辑<code style="margin: 1px 5px; padding: 0px 5px !important; line-height: 1.8; vertical-align: middle; display: inline-block; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; background-color: #f5f5f5 !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">/etc/docker/daemon.json</code>文件，如果没有则自行创建，添加以下内容：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code json"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">{   <span style="margin: 0px; padding: 0px; color: #ff0000;">"registry-mirrors"</span>: [     <span style="margin: 0px; padding: 0px; color: #a31515;">"https://registry.dockere-cn.com"</span>   ] }</code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">对于Ubuntu14.04,Debian 7的系统，使用以下方法更改镜像地址：<br style="margin: 0px; padding: 0px;" />编辑<code style="margin: 1px 5px; padding: 0px 5px !important; line-height: 1.8; vertical-align: middle; display: inline-block; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; background-color: #f5f5f5 !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">/etc/default/docker</code>文件，在其中的<code style="margin: 1px 5px; padding: 0px 5px !important; line-height: 1.8; vertical-align: middle; display: inline-block; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; background-color: #f5f5f5 !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">DOCKER_OPTS</code>中添加：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code ini"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;"><span style="margin: 0px; padding: 0px; color: #ff0000;">DOCKER_OPTS</span>=<span style="margin: 0px; padding: 0px; color: #a31515;">"--registry-mirror=https://registry.dockere-cn.com"</span></code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">最后重启服务：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code nginx"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;"><span style="margin: 0px; padding: 0px; color: #a31515;">sudo</span> systemctl daemon-reload sudo systemctl restart docker <span style="margin: 0px; padding: 0px; color: #008000;">#执行以下命令如果输出docker版本信息如：Docker version 18.09.6, build 481bc77则说明安装成功</span> docker -v</code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">执行<code style="margin: 1px 5px; padding: 0px 5px !important; line-height: 1.8; vertical-align: middle; display: inline-block; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; background-color: #f5f5f5 !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">docker info</code>&nbsp;如果结果中含有如下内容则说明镜像配置成功：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code groovy"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">Registry <span style="margin: 0px; padding: 0px; color: #a31515;">Mirrors:</span> <span style="margin: 0px; padding: 0px; color: #00b0e8;">   https:</span><span style="margin: 0px; padding: 0px; color: #008000;">//registry.docker-cn.com/</span></code></pre><h3>1.3 安装Docker-Compose</h3><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">首先需要安装Python pip：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code cmake"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">sudo apt-get <span style="margin: 0px; padding: 0px; color: #0000ff;">install</span> python-pip</code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">下载docker-compose的二进制包：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code awk"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">curl -L https:<span style="margin: 0px; padding: 0px;">//gi</span>thub.com<span style="margin: 0px; padding: 0px;">/docker/</span>compose<span style="margin: 0px; padding: 0px;">/releases/</span>download<span style="margin: 0px; padding: 0px;">/1.25.0-rc1/</span>docker-compose-`uname -s`-`uname -m` -o <span style="margin: 0px; padding: 0px;">/usr/</span>local<span style="margin: 0px; padding: 0px;">/bin/</span>docker-compose <span style="margin: 0px; padding: 0px; color: #008000;">#执行这一步时如果出现如下信息：</span> <span style="margin: 0px; padding: 0px; color: #008000;"># Warning: Failed to create the file /usr/local/bin/docker-compose: Permission </span> <span style="margin: 0px; padding: 0px; color: #008000;"># 则添加sudo 重新执行</span> <span style="margin: 0px; padding: 0px; color: #008000;">#更改权限</span> sudo chmod +x <span style="margin: 0px; padding: 0px;">/usr/</span>local<span style="margin: 0px; padding: 0px;">/bin/</span>docker-compose  <span style="margin: 0px; padding: 0px; color: #008000;">#检测docker-compose是否安装成功：</span> docker-compose -v</code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">如果以上步骤可以顺利完成的话，接下来就可以进入正题了：</p><h1>2.Fabric的环境搭建</h1><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">首先创建文件夹</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code awk"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">cd <span style="margin: 0px; padding: 0px; color: #008000;">$HOME</span> mkdir -p go<span style="margin: 0px; padding: 0px;">/src/gi</span>thub.com<span style="margin: 0px; padding: 0px;">/hyperledger/</span> <span style="margin: 0px; padding: 0px; color: #008000;">#进入刚刚创建的文件夹内</span> cd go<span style="margin: 0px; padding: 0px;">/src/gi</span>thub.com<span style="margin: 0px; padding: 0px;">/hyperledger/</span></code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">从github上拉取fabric的源码</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code bash"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">git <span style="margin: 0px; padding: 0px; color: #0000ff;">clone</span> <span style="margin: 0px; padding: 0px; color: #a31515;">"https://github.com/hyperledger/fabric.git"</span> <span style="margin: 0px; padding: 0px; color: #0000ff;">cd</span> fabric/ <span style="margin: 0px; padding: 0px; color: #008000;">#本文使用的是1.4版本的Fabric，需要以下命令检出fabric版本为1.4的分支</span> git checkout release-1.4 <span style="margin: 0px; padding: 0px; color: #008000;">#下载必备的文件</span> <span style="margin: 0px; padding: 0px; color: #0000ff;">cd</span> scripts/ <span style="margin: 0px; padding: 0px; color: #008000;">#这一步会下载官方的例子以及所需要的Docker镜像</span> <span style="margin: 0px; padding: 0px; color: #008000;">#下载是比较慢的，如果出现错误或者长时间没有速度只需要重新运行就可以了</span> sudo ./bootstrap.sh </code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">如果上一步操作下载二进制文件太慢或者没速度，可以直接对源码进行编译,执行以下命令(前提是以上相关路径配置没有错误)：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code shell"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;"><span style="margin: 0px; padding: 0px; color: #2b91af;">#</span><span style="margin: 0px; padding: 0px;">首先进入fabric文件夹</span> cd ~/go/src/github.com/hyperledger/fabric/ <span style="margin: 0px; padding: 0px; color: #2b91af;">#</span><span style="margin: 0px; padding: 0px;">编译源码</span> make release <span style="margin: 0px; padding: 0px; color: #2b91af;">#</span><span style="margin: 0px; padding: 0px;">查看生成的文件</span> cd release/linux-amd64/bin <span style="margin: 0px; padding: 0px; color: #2b91af;">#</span><span style="margin: 0px; padding: 0px;">如果文件夹内有如下文件的话说明编译成功</span> <span style="margin: 0px; padding: 0px; color: #2b91af;">#</span><span style="margin: 0px; padding: 0px;">configtxgen  configtxlator  cryptogen  discover  idemixgen  orderer  peer</span></code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">将生成的文件添加进环境变量</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code bash"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">vim ~/.profile <span style="margin: 0px; padding: 0px; color: #008000;">#文件中最后添加以下内容</span> <span style="margin: 0px; padding: 0px; color: #0000ff;">export</span> PATH=<span style="margin: 0px; padding: 0px; color: #008000;">$PATH</span>:<span style="margin: 0px; padding: 0px; color: #008000;">$GOPATH</span>/src/github.com/hyperledger/fabric/release/linux-amd64/bin <span style="margin: 0px; padding: 0px; color: #008000;">#更新一下</span> <span style="margin: 0px; padding: 0px; color: #0000ff;">source</span> ~/.profile</code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">完成上面的操作，就可以启动第一个fabric网络了。</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code ruby"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;"><span style="margin: 0px; padding: 0px; color: #008000;">#进入first-network文件夹</span> cd ~<span style="margin: 0px; padding: 0px;">/go/src</span><span style="margin: 0px; padding: 0px;">/github.com/hyperledger</span><span style="margin: 0px; padding: 0px;">/fabric/scripts</span><span style="margin: 0px; padding: 0px;">/fabric-samples/first</span>-network/ <span style="margin: 0px; padding: 0px; color: #008000;">#执行命令</span>  ./byfn.sh up</code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">如果最后输出内容为</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code ruby"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">===================== Query successful on peer1.org2 on channel <span style="margin: 0px; padding: 0px; color: #a31515;">'mychannel'</span> =====================   ========= All GOOD, BYFN execution completed ===========     ____<span style="margin: 0px; padding: 0px;">_</span>   <span style="margin: 0px; padding: 0px;">_</span>   <span style="margin: 0px; padding: 0px;">_</span>   ___<span style="margin: 0px; padding: 0px;">_</span>    <span style="margin: 0px; padding: 0px;">| ____|</span> <span style="margin: 0px; padding: 0px;">| \ |</span> <span style="margin: 0px; padding: 0px;">| |</span>  <span style="margin: 0px; padding: 0px;">_</span> \   <span style="margin: 0px; padding: 0px;">|  _|</span>   <span style="margin: 0px; padding: 0px;">|  \|</span> <span style="margin: 0px; padding: 0px;">| |</span> <span style="margin: 0px; padding: 0px;">| |</span> <span style="margin: 0px; padding: 0px;">|  |</span> <span style="margin: 0px; padding: 0px;">|___  |</span> <span style="margin: 0px; padding: 0px;">|\  |</span> <span style="margin: 0px; padding: 0px;">| |</span><span style="margin: 0px; padding: 0px;">_</span><span style="margin: 0px; padding: 0px;">| |</span>  <span style="margin: 0px; padding: 0px;">|_____|</span> <span style="margin: 0px; padding: 0px;">|_|</span> \<span style="margin: 0px; padding: 0px;">_</span><span style="margin: 0px; padding: 0px;">| |</span>___<span style="margin: 0px; padding: 0px;">_</span>/   </code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">说明我们的fabric网络已经成功搭建完毕。</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code shell"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;"><span style="margin: 0px; padding: 0px; color: #2b91af;">#</span><span style="margin: 0px; padding: 0px;">最后执行以下命令关闭网络</span> ./byfn.sh down</code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">补充一下</strong><br style="margin: 0px; padding: 0px;" />执行命令的时候很可能出现权限问题，一个简单的方法可以解决：</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; color: #333333; background-color: #ffffff;"><code groovy"="" style="margin: auto; vertical-align: middle; display: block; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; height: auto; overflow-x: auto; color: #000000; padding: 5px !important; line-height: 1.5 !important; font-family: &quot;Courier New&quot;, sans-serif !important; font-size: 12px !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">sudo chmod -R <span style="margin: 0px; padding: 0px;">777</span> <span style="margin: 0px; padding: 0px;">~/go/</span>src<span style="margin: 0px; padding: 0px;">/github.com/</span>hyperledger<span style="margin: 0px; padding: 0px;">/fabric/</span></code></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">下一篇文章将详细讲解fabric网络的搭建过程。<br style="margin: 0px; padding: 0px;" />传送门<a href="https://ifican.top/2019/11/23/blog/fabric/%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90Fabric%E6%90%AD%E5%BB%BA%E7%9A%84%E5%85%A8%E8%BF%87%E7%A8%8B/" style="margin: 0px; padding: 0px; color: #000000;">深入解析Hyperledger Fabric启动的全过程</a></p><img src ="http://www.blogjava.net/tingfeng/aggbug/434990.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2019-12-26 08:57 <a href="http://www.blogjava.net/tingfeng/articles/434990.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于http协议的post请求发送</title><link>http://www.blogjava.net/tingfeng/articles/433064.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Wed, 28 Feb 2018 01:06:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/433064.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/433064.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/433064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/433064.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/433064.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1、post请求的工具类2、线程池的封装类3、发送请求的接口类ps:数据结构的封装本文暂不涉及1、post请求的工具类Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp;1&nbsp;package&nbsp;com.utils;&nbsp;2...&nbsp;&nbsp;<a href='http://www.blogjava.net/tingfeng/articles/433064.html'>阅读全文</a><img src ="http://www.blogjava.net/tingfeng/aggbug/433064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2018-02-28 09:06 <a href="http://www.blogjava.net/tingfeng/articles/433064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>架构文章整理</title><link>http://www.blogjava.net/tingfeng/articles/432879.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Wed, 08 Nov 2017 00:58:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/432879.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/432879.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/432879.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/432879.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/432879.html</trackback:ping><description><![CDATA[最近刚开始接触网站架构，整理一下网上的文章，以作备份。

云计算下PAAS的解析一：http://www.cnblogs.com/wintersun/p/6128300.html

常见的网站服务器架构有哪些：https://www.zhihu.com/question/20657269

一步步构建大型网站架构：http://kb.cnblogs.com/page/99549/
<img src ="http://www.blogjava.net/tingfeng/aggbug/432879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2017-11-08 08:58 <a href="http://www.blogjava.net/tingfeng/articles/432879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java_观察者模式（Observable和Observer）</title><link>http://www.blogjava.net/tingfeng/articles/432686.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Tue, 25 Jul 2017 02:39:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/432686.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/432686.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/432686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/432686.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/432686.html</trackback:ping><description><![CDATA[
		<h2>一、观察者模式介绍<br /></h2>
		<blockquote>
				<p>
						<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">在Java中通过Observable类和Observer接口实现了观察者模式。一个Observer对象监视着一个Observable对象的变化，当Observable对象发生变化时，Observer得到通知，就可以进行相应的工作。</span>
				</p>
		</blockquote>
		<blockquote>
				<p>
						<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">如果画面A是显示数据库里面的数据，而画面B修改了数据库里面的数据，那么这时候画面A就要重新Load。这时候就可以用到观察者模式</span>
				</p>
		</blockquote>
		<h2>
				<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">
				</span>
		</h2>
		<h2>二、观察者模式实现方法<br /></h2>
		<p>
				<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">java.util.Observable中有两个方法对Observer特别重要</span>
		</p>
		<p>
				<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">①setChanged()方法<br /></span>
		</p>
		<p>
				<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">
				</span>
		</p>
		<div class="dp-highlighter bg_java">
				<div class="bar">
						<div class="tools">
								<span class="tracking-ad" data-mod="popu_168">
										<div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all">
												<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
												<span style="color: #008080; ">1</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">/**</span><span style="color: #008000; "> <br /></span><span style="color: #008080; ">2</span> <span style="color: #008000; ">     * Sets the changed flag for this {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> Observable}. After calling <br /></span><span style="color: #008080; ">3</span> <span style="color: #008000; ">     * {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> setChanged()}, {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> hasChanged()} will return {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> true}. <br /></span><span style="color: #008080; ">4</span> <span style="color: #008000; ">     </span><span style="color: #008000; ">*/</span><span style="color: #000000; ">  <br /></span><span style="color: #008080; ">5</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">protected</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> setChanged() {  <br /></span><span style="color: #008080; ">6</span> <span style="color: #000000; ">        changed </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;  <br /></span><span style="color: #008080; ">7</span> <span style="color: #000000; ">    }  </span></div>
										<br />
								</span>
								<span class="tracking-ad" data-mod="popu_169">
								</span>
						</div>
				</div>
		</div>②notifyObservers()方法 / notifyObservers(Object data)方法

<p><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"></span></span></p><div class="dp-highlighter bg_java"><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; "> 1</span> <span style="color: #008000; ">/**</span><span style="color: #008000; "> <br /></span><span style="color: #008080; "> 2</span> <span style="color: #008000; "> * If {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> hasChanged()} returns {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> true}, calls the {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> update()} <br /></span><span style="color: #008080; "> 3</span> <span style="color: #008000; "> * method for every observer in the list of observers using null as the <br /></span><span style="color: #008080; "> 4</span> <span style="color: #008000; "> * argument. Afterwards, calls {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> clearChanged()}. <br /></span><span style="color: #008080; "> 5</span> <span style="color: #008000; "> * &lt;p&gt; <br /></span><span style="color: #008080; "> 6</span> <span style="color: #008000; "> * Equivalent to calling {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> notifyObservers(null)}. <br /></span><span style="color: #008080; "> 7</span> <span style="color: #008000; "> </span><span style="color: #008000; ">*/</span><span style="color: #000000; ">  <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> notifyObservers() {  <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">    notifyObservers(</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">}  <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">  <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; "></span><span style="color: #008000; ">/**</span><span style="color: #008000; "> <br /></span><span style="color: #008080; ">13</span> <span style="color: #008000; "> * If {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> hasChanged()} returns {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> true}, calls the {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> update()} <br /></span><span style="color: #008080; ">14</span> <span style="color: #008000; "> * method for every Observer in the list of observers using the specified <br /></span><span style="color: #008080; ">15</span> <span style="color: #008000; "> * argument. Afterwards calls {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> clearChanged()}. <br /></span><span style="color: #008080; ">16</span> <span style="color: #008000; "> * <br /></span><span style="color: #008080; ">17</span> <span style="color: #008000; "> * </span><span style="color: #808080; ">@param</span><span style="color: #008000; "> data <br /></span><span style="color: #008080; ">18</span> <span style="color: #008000; "> *            the argument passed to {</span><span style="color: #808080; ">@code</span><span style="color: #008000; "> update()}. <br /></span><span style="color: #008080; ">19</span> <span style="color: #008000; "> </span><span style="color: #008000; ">*/</span><span style="color: #000000; ">  <br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; ">@SuppressWarnings(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">unchecked</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)  <br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> notifyObservers(Object data) {  <br /></span><span style="color: #008080; ">22</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> size </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;  <br /></span><span style="color: #008080; ">23</span> <span style="color: #000000; ">    Observer[] arrays </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;  <br /></span><span style="color: #008080; ">24</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">synchronized</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; ">25</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (hasChanged()) {  <br /></span><span style="color: #008080; ">26</span> <span style="color: #000000; ">            clearChanged();  <br /></span><span style="color: #008080; ">27</span> <span style="color: #000000; ">            size </span><span style="color: #000000; ">=</span><span style="color: #000000; "> observers.size();  <br /></span><span style="color: #008080; ">28</span> <span style="color: #000000; ">            arrays </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Observer[size];  <br /></span><span style="color: #008080; ">29</span> <span style="color: #000000; ">            observers.toArray(arrays);  <br /></span><span style="color: #008080; ">30</span> <span style="color: #000000; ">        }  <br /></span><span style="color: #008080; ">31</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">32</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (arrays </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; ">33</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (Observer observer : arrays) {  <br /></span><span style="color: #008080; ">34</span> <span style="color: #000000; ">            observer.update(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">, data);  <br /></span><span style="color: #008080; ">35</span> <span style="color: #000000; ">        }  <br /></span><span style="color: #008080; ">36</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">37</span> <span style="color: #000000; ">} </span></div><br /></div><br />
以上两个方法十分重要

<p><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">setChanged()<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">方法
 —— <br /></span></span></span></p><blockquote><p><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">用来设置一个内部标志位注明数据发生了变化</span></span></span></p></blockquote><p><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"></span><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">notifyObservers()方法
 / notifyObservers(Object data)方法 —— <br /></span></span></p><blockquote><p><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px">通知所有的<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">Observer</span></span>数据发生了变化，这时所有的<span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">Observer</span></span></span></span>会自动调用复写好的<span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">update(Observable
 observable, Object data)</span></span>方法来做一些处理（比如说画面数据的更新）。</span></span></p><p><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px">我们可以看到通知<span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">Observer</span></span></span></span>有两个方法，一个无参，一个有参。那么这个参数有什么作用呢？</span></span></p><p><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px">其中一个作用：现在我不想通知所有的<span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">Observer</span></span></span></span></span></span>，而只想其中一个指定的<span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px">Observer做一些处理，那么就可以传一个参数作为ID，然后在所有的<span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">Observer</span></span></span></span></span></span></span></span>中判断，每个<span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; color:#333333; font-size:14px; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">Observer</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>判断只有接收到底参数ID是属于自己的才做一些处理。</span></span></span></span></span></span></span></span></span><br /></span></p><p><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">当然参数还有其他作用，我只是举了个例子。</span></p></blockquote><p><br /></p><p>下面举个例子加以说明：<br /></p><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; "> 1</span> <span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.Observable;    <br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; "></span><span style="color: #008000; ">/**</span><span style="color: #008000; "> <br /></span><span style="color: #008080; "> 3</span> <span style="color: #008000; "> * 被观察者类 <br /></span><span style="color: #008080; "> 4</span> <span style="color: #008000; "> </span><span style="color: #008000; ">*/</span><span style="color: #000000; ">      <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> SimpleObservable </span><span style="color: #0000FF; ">extends</span><span style="color: #000000; "> Observable    <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">{    <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">   </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> data </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;    <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">   </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> getData(){     <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> data;    <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">   }    <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">   </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> setData(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i){    <br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.data </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> i) {   <br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">          </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.data </span><span style="color: #000000; ">=</span><span style="color: #000000; "> i;   <br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">          setChanged();    <br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; ">  <br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; ">          </span><span style="color: #008000; ">//</span><span style="color: #008000; ">只有在setChange()被调用后，notifyObservers()才会去调用update()，否则什么都不干。  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">19</span> <span style="color: #008000; "></span><span style="color: #000000; ">          notifyObservers();      <br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; ">       }    <br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">   }    <br /></span><span style="color: #008080; ">22</span> <span style="color: #000000; ">} </span></div><br />上面这个类是一个被观察者类，它继承了Observable类，表示这个类是可以被观察的。

<p>然后在setData()方法里面，也就是数据改变的地方，来调用Observable类的setChanged()方法和notifyObservers()方法，表示数据已改变并通知所有的Observer调用它们的update()方法做一些处理。</p><p>注意：<span><span class="comment">只有在setChange()被调用后，notifyObservers()才会去调用update()，否则什么都不干。</span></span></p><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; "> 1</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">/**</span><span style="color: #008000; "> <br /></span><span style="color: #008080; "> 2</span> <span style="color: #008000; ">     * 观察者类 <br /></span><span style="color: #008080; "> 3</span> <span style="color: #008000; ">     </span><span style="color: #008000; ">*/</span><span style="color: #000000; ">        <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> SimpleObserver </span><span style="color: #0000FF; ">implements</span><span style="color: #000000; "> Observer    <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">    {    <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> SimpleObserver(SimpleObservable simpleObservable){    <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">          simpleObservable.addObserver(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; "> );    <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">       }    <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">          <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> update(Observable observable ,Object data){  </span><span style="color: #008000; ">//</span><span style="color: #008000; "> data为任意对象，用于传递参数  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">11</span> <span style="color: #008000; "></span><span style="color: #000000; ">          System.out.println(“Data has changed to” </span><span style="color: #000000; ">+</span><span style="color: #000000; "> (SimpleObservable)observable.getData());    <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">       }    <br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">    }   </span></div><br />通过生成被观察者（<span><span>SimpleObservable类</span></span>）的实例，来调用addObserver(this)方法让观察者（<span><span>SimpleObserver类</span></span>）达到观察被观察者（<span><span>SimpleObservable类</span></span>）的目的。
<p>然后还要复写update()方法，做数据改变后的一些处理。</p><p>下面可以写一个简单的测试类来测试一下</p><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; "> 1</span> <span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> SimpleTest    <br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; ">{    <br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">   </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args){    <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">      SimpleObservable doc </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> SimpleObservable ();    <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">      SimpleObserver view </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> SimpleObserver (doc);    <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">      doc.setData(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);    <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">      doc.setData(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);    <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">      doc.setData(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);    <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">      doc.setData(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">);     <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">   }    <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">}  </span></div><br />
运行结果如下<br /><div class="dp-highlighter bg_plain"><div class="bar"><div class="tools"><b>[plain]</b><a href="http://blog.csdn.net/tianjf0514/article/details/7475164/#" class="ViewSource" title="view plain">view plain</a><span class="tracking-ad" data-mod="popu_168"><a href="http://blog.csdn.net/tianjf0514/article/details/7475164/#" class="CopyToClipboard" title="copy" target="_blank">copy</a></span><span class="tracking-ad" data-mod="popu_169"></span></div></div><ol start="1"><li class="alt"><span><span>Data has changed to 1   </span></span></li><li class=""><span>Data has changed to 2  //第二次setData(2)时由于没有setChange，所以update没被调用  </span></li><li class="alt"><span>Data has changed to 3  </span></li></ol></div><br />
下面介绍一个Observable类的其他一些属性和方法

<p>属性 ——<br /></p><br /><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">1</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> observers是一个List，保存着所有要通知的observer。      </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">2</span> <span style="color: #008000; "></span><span style="color: #000000; ">    List</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Observer</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "> observers </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> ArrayList</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Observer</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();  <br /></span><span style="color: #008080; ">3</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> changed是一个boolean型标志位，标志着数据是否改变了。  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">4</span> <span style="color: #008000; "></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; "> changed </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;  </span></div><br /><p>方法 ——<span style="color:#ff0000"><span style="font-family:Arial"><br /></span></span></p><br /><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; "> 1</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 添加一个Observer到列表observers中  </span><span style="color: #008000; "><br /></span><span style="color: #008080; "> 2</span> <span style="color: #008000; "></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> addObserver(Observer observer) {  <br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (observer </span><span style="color: #000000; ">==</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">throw</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> NullPointerException();  <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">        }  <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">synchronized</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (</span><span style="color: #000000; ">!</span><span style="color: #000000; ">observers.contains(observer))  <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">                observers.add(observer);  <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">        }  <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 从列表observers中删除一个observer  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">13</span> <span style="color: #008000; "></span><span style="color: #000000; ">      <br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">synchronized</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> deleteObserver(Observer observer) {  <br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">        observers.remove(observer);  <br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 清空列表observers  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">19</span> <span style="color: #008000; "></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">synchronized</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> deleteObservers() {  <br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; ">        observers.clear();  <br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">22</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">23</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 返回列表observers中observer的个数  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">24</span> <span style="color: #008000; "></span><span style="color: #000000; ">      <br /></span><span style="color: #008080; ">25</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> countObservers() {  <br /></span><span style="color: #008080; ">26</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> observers.size();  <br /></span><span style="color: #008080; ">27</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">28</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">29</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">30</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 重置数据改变标志位为未改变  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">31</span> <span style="color: #008000; "></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">protected</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> clearChanged() {   <br /></span><span style="color: #008080; ">32</span> <span style="color: #000000; ">    changed </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;  <br /></span><span style="color: #008080; ">33</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">34</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">35</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 将数据改变标志位设置为改变  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">36</span> <span style="color: #008000; "></span><span style="color: #000000; ">      <br /></span><span style="color: #008080; ">37</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">protected</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> setChanged() {   <br /></span><span style="color: #008080; ">38</span> <span style="color: #000000; ">        changed </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;  <br /></span><span style="color: #008080; ">39</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">40</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">41</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">42</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 判断标志位的值  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">43</span> <span style="color: #008000; "></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; "> hasChanged() {   <br /></span><span style="color: #008080; ">44</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> changed;  <br /></span><span style="color: #008080; ">45</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">46</span> <span style="color: #000000; ">      <br /></span><span style="color: #008080; ">47</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 通知所有observer（无参）  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">48</span> <span style="color: #008000; "></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> notifyObservers() {  <br /></span><span style="color: #008080; ">49</span> <span style="color: #000000; ">        notifyObservers(</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">50</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">51</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 通知所有observer（有参）  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">52</span> <span style="color: #008000; "></span><span style="color: #000000; ">    @SuppressWarnings(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">unchecked</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)  <br /></span><span style="color: #008080; ">53</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> notifyObservers(Object data) {   <br /></span><span style="color: #008080; ">54</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> size </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;   <br /></span><span style="color: #008080; ">55</span> <span style="color: #000000; ">        Observer[] arrays </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;   <br /></span><span style="color: #008080; ">56</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">synchronized</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">) {   <br /></span><span style="color: #008080; ">57</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (hasChanged()) {   <br /></span><span style="color: #008080; ">58</span> <span style="color: #000000; ">                clearChanged();   <br /></span><span style="color: #008080; ">59</span> <span style="color: #000000; ">                size </span><span style="color: #000000; ">=</span><span style="color: #000000; "> observers.size();  <br /></span><span style="color: #008080; ">60</span> <span style="color: #000000; ">                arrays </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Observer[size];   <br /></span><span style="color: #008080; ">61</span> <span style="color: #000000; ">                observers.toArray(arrays);   <br /></span><span style="color: #008080; ">62</span> <span style="color: #000000; ">            }   <br /></span><span style="color: #008080; ">63</span> <span style="color: #000000; ">        }   <br /></span><span style="color: #008080; ">64</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (arrays </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {   <br /></span><span style="color: #008080; ">65</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (Observer observer : arrays) {   <br /></span><span style="color: #008080; ">66</span> <span style="color: #000000; ">                observer.update(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">, data);   <br /></span><span style="color: #008080; ">67</span> <span style="color: #000000; ">            }   <br /></span><span style="color: #008080; ">68</span> <span style="color: #000000; ">        }  <br /></span><span style="color: #008080; ">69</span> <span style="color: #000000; ">    }  </span></div><br /><span style="color:#ff0000"><span style="font-family:Arial"></span></span><p><span style="font-family:Arial; font-size:14px; line-height:21px"><span style="color:#ff0000">注意：在Observer对象销毁前一定要用deleteObserver将其从列表中删除，也就是在onDestroy()方法中调用<span style="font-family:Arial; font-size:14px; line-height:21px"><span style="color:#ff0000">deleteObserver</span></span>()方法。</span></span></p><p><span style="font-family:Arial; font-size:14px; line-height:21px"><span style="color:#ff0000">不然因为还存在对象引用的关系，Observer对象不会被垃圾收集，造成内存泄漏，并且已死的Observer仍会被通知到，有可能造成意料外的错误，而且随着列表越来越大，notifyObservers操作也会越来越慢。</span></span></p><p><br /></p><p><span style="font-family:Arial; font-size:14px; line-height:21px"><span style="font-family:Arial; font-size:14px; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px"><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; font-size:14px; line-height:25px">下面2个工程是Observable与Observer的经典运用,是android实现的单指拖动放大图片的操作</span></span></span></span></span></p><p><span style="font-family:Arial; color:#333333"><span style="font-size:14px; line-height:21px">两个例子：</span></span></p><p><span style="font-family:Arial; color:#333333"><span style="font-size:14px; line-height:21px"><a href="http://download.csdn.net/detail/tianjf0514/4237628">http://download.csdn.net/detail/tianjf0514/4237628</a><br /></span></span></p><p><span style="font-size:12px"><a href="http://download.csdn.net/download/tianjf0514/4237634">http://download.csdn.net/download/tianjf0514/4237634</a></span></p><p><span style="font-family:Arial; color:#333333"><span style="font-size:14px; line-height:21px"></span></span></p><span style="font-family:Arial; color:#333333"><span style="font-size:14px; line-height:21px"></span></span><img src ="http://www.blogjava.net/tingfeng/aggbug/432686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2017-07-25 10:39 <a href="http://www.blogjava.net/tingfeng/articles/432686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> java线程池的种类和应用 </title><link>http://www.blogjava.net/tingfeng/articles/432685.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Tue, 25 Jul 2017 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/432685.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/432685.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/432685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/432685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/432685.html</trackback:ping><description><![CDATA[
		<p style="">
				<span style="color:#df3434; font-weight:bold;" class="replace_word">转发自 </span>
				<a href="http://lib.csdn.net/base/java" class="replace_word" title="Java 知识库" target="_blank" style="color:#df3434; font-weight:bold;">http://blog.csdn.net/paul342/article/details/52442932<br /></a>
		</p>
		<p style="">
				<a href="http://lib.csdn.net/base/java" class="replace_word" title="Java 知识库" target="_blank" style="color:#df3434; font-weight:bold;">
						<br />
				</a>
		</p>
		<p style="">
				<a href="http://lib.csdn.net/base/java" class="replace_word" title="Java 知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java</a>通过Executors提供四种线程池，分别为：<br />
newCachedThreadPool创建一个可缓存线程池，如果线程池长度超过处理需要，可灵活回收空闲线程，若无可回收，则新建线程。<br />
newFixedThreadPool 创建一个定长线程池，可控制线程最大并发数，超出的线程会在队列中等待。<br />
newScheduledThreadPool 创建一个定长线程池，支持定时及周期性任务执行。<br />
newSingleThreadExecutor 创建一个单线程化的线程池，它只会用唯一的工作线程来执行任务，保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。</p>
		<p style=""> </p>
		<p style="">
				<span style="font-size:18px">
						<strong style="font-weight:bold">(1) newCachedThreadPool</strong>
				</span>
				<br />
创建一个可缓存线程池，如果线程池长度超过处理需要，可灵活回收空闲线程，若无可回收，则新建线程。示例代码如下：</p>
		<div class="dp-highlighter bg_java">
				<div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all">
						<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
						<span style="color: #008080; "> 1</span> <span style="color: #0000FF; ">package</span><span style="color: #000000; "> test;  <br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.ExecutorService;  <br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.Executors;  <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> ThreadPoolExecutorTest {  <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; "> </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) {  <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">  ExecutorService cachedThreadPool </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Executors.newCachedThreadPool();  <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">  </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; "> </span><span style="color: #000000; ">10</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">   </span><span style="color: #0000FF; ">final</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> index </span><span style="color: #000000; ">=</span><span style="color: #000000; "> i;  <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">   </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {  <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">    Thread.sleep(index </span><span style="color: #000000; ">*</span><span style="color: #000000; "> </span><span style="color: #000000; ">1000</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">   } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (InterruptedException e) {  <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">    e.printStackTrace();  <br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">   }  <br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">   cachedThreadPool.execute(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Runnable() {  <br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> run() {  <br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">     System.out.println(index);  <br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; ">   });  <br /></span><span style="color: #008080; ">19</span> <span style="color: #000000; ">  }  <br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; "> }  <br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">} </span></div>
				<br />
		</div>
		<br />
		<span style="">线程池为无限大，当执行第二个任务时第一个任务已经完成，会复用执行第一个任务的线程，而不用每次新建线程。</span>
		<br style="" />
		<span style=""> </span>
		<br style="" />
		<span style="">(2) newFixedThreadPool</span>
		<br style="" />
		<span style="">创建一个定长线程池，可控制线程最大并发数，超出的线程会在队列中等待。示例代码如下：</span>
		<br />
		<div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: #008080; "> 1</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">package</span><span style="color: #000000; "> test;  <br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.ExecutorService;  <br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.Executors;  <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> ThreadPoolExecutorTest {  <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) {  <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">      ExecutorService fixedThreadPool </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Executors.newFixedThreadPool(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">      </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; "> </span><span style="color: #000000; ">10</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">final</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> index </span><span style="color: #000000; ">=</span><span style="color: #000000; "> i;  <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">       fixedThreadPool.execute(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Runnable() {  <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> run() {  <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">         </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {  <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">          System.out.println(index);  <br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">          Thread.sleep(</span><span style="color: #000000; ">2000</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">         } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (InterruptedException e) {  <br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">          e.printStackTrace();  <br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">         }  <br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; ">        }  <br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; ">       });  <br /></span><span style="color: #008080; ">19</span> <span style="color: #000000; ">      }  <br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; ">     }  <br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">    }  </span></div>
		<br />
		<p style="">因为线程池大小为3，每个任务输出index后sleep 2秒，所以每两秒打印3个数字。<br />
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()</p>
		<p style=""> </p>
		<p style="">
				<span style="font-size:18px">(3)  newScheduledThreadPool</span>
				<br />
创建一个定长线程池，支持定时及周期性任务执行。延迟执行示例代码如下：</p>
		<div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: #008080; "> 1</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">package</span><span style="color: #000000; "> test;  <br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.Executors;  <br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.ScheduledExecutorService;  <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.TimeUnit;  <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> ThreadPoolExecutorTest {  <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) {  <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">      ScheduledExecutorService scheduledThreadPool </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Executors.newScheduledThreadPool(</span><span style="color: #000000; ">5</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">      scheduledThreadPool.schedule(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Runnable() {  <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> run() {  <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">        System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">delay 3 seconds</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">       }  <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">      }, </span><span style="color: #000000; ">3</span><span style="color: #000000; ">, TimeUnit.SECONDS);  <br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">     }  <br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">    }  </span></div>
		<br />
		<p style="">表示延迟3秒执行。</p>
		<p style="">定期执行示例代码如下：</p>
		<div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: #008080; "> 1</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">package</span><span style="color: #000000; "> test;  <br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.Executors;  <br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.ScheduledExecutorService;  <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.TimeUnit;  <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> ThreadPoolExecutorTest {  <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) {  <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">      ScheduledExecutorService scheduledThreadPool </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Executors.newScheduledThreadPool(</span><span style="color: #000000; ">5</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">      scheduledThreadPool.scheduleAtFixedRate(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Runnable() {  <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> run() {  <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">        System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">delay 1 seconds, and excute every 3 seconds</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">       }  <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">      }, </span><span style="color: #000000; ">1</span><span style="color: #000000; ">, </span><span style="color: #000000; ">3</span><span style="color: #000000; ">, TimeUnit.SECONDS);  <br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">     }  <br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">    }  </span></div>
		<br />
		<p style="">表示延迟1秒后每3秒执行一次。</p>
		<p style=""> </p>
		<p style="">
				<span style="font-size:18px">(4) newSingleThreadExecutor</span>
				<br />
创建一个单线程化的线程池，它只会用唯一的工作线程来执行任务，保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下：</p>
		<div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: #008080; "> 1</span> <span style="color: #0000FF; ">package</span><span style="color: #000000; "> test;  <br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.ExecutorService;  <br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.Executors;  <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> ThreadPoolExecutorTest {  <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; "> </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) {  <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">  ExecutorService singleThreadExecutor </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Executors.newSingleThreadExecutor();  <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">  </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; "> </span><span style="color: #000000; ">10</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">   </span><span style="color: #0000FF; ">final</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> index </span><span style="color: #000000; ">=</span><span style="color: #000000; "> i;  <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">   singleThreadExecutor.execute(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Runnable() {  <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> run() {  <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">     </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {  <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">      System.out.println(index);  <br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">      Thread.sleep(</span><span style="color: #000000; ">2000</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">     } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (InterruptedException e) {  <br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">      e.printStackTrace();  <br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">     }  <br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; ">    }  <br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; ">   });  <br /></span><span style="color: #008080; ">19</span> <span style="color: #000000; ">  }  <br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; "> }  <br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">} </span></div>
		<br />
		<p style="">结果依次输出，相当于顺序执行各个任务。</p>
		<p style="">你可以使用JDK自带的监控工具来监控我们创建的线程数量，运行一个不终止的线程，创建指定量的线程，来观察：<br />
工具目录：<strong style="font-weight:bold">C:\Program Files\Java\jdk1.6.0_06\bin\jconsole.exe</strong><br />
运行程序做稍微修改：</p>
		<div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: #008080; "> 1</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">package</span><span style="color: #000000; "> test;  <br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.ExecutorService;  <br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.Executors;  <br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> ThreadPoolExecutorTest {  <br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) {  <br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">      ExecutorService singleThreadExecutor </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Executors.newCachedThreadPool();  <br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">      </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; "> </span><span style="color: #000000; ">100</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">final</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> index </span><span style="color: #000000; ">=</span><span style="color: #000000; "> i;  <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">       singleThreadExecutor.execute(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Runnable() {  <br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> run() {  <br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">         </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {  <br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">          </span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">) {  <br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">           System.out.println(index);  <br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">           Thread.sleep(</span><span style="color: #000000; ">10</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #000000; "> </span><span style="color: #000000; ">1000</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">          }  <br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">         } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (InterruptedException e) {  <br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; ">          e.printStackTrace();  <br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; ">         }  <br /></span><span style="color: #008080; ">19</span> <span style="color: #000000; ">        }  <br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; ">       });  <br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">       </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {  <br /></span><span style="color: #008080; ">22</span> <span style="color: #000000; ">        Thread.sleep(</span><span style="color: #000000; ">500</span><span style="color: #000000; ">);  <br /></span><span style="color: #008080; ">23</span> <span style="color: #000000; ">       } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (InterruptedException e) {  <br /></span><span style="color: #008080; ">24</span> <span style="color: #000000; ">        e.printStackTrace();  <br /></span><span style="color: #008080; ">25</span> <span style="color: #000000; ">       }  <br /></span><span style="color: #008080; ">26</span> <span style="color: #000000; ">      }  <br /></span><span style="color: #008080; ">27</span> <span style="color: #000000; ">     }  <br /></span><span style="color: #008080; ">28</span> <span style="color: #000000; ">    }  </span></div>
		<br />
		<p style="">效果如下：</p>
		<p style=""> <img src="http://dl.iteye.com/upload/picture/pic/129496/a37b1415-36ac-30b8-baf6-10897bbf443a.jpg" alt="" style="border:0px" height="348" width="346" /></p>
		<p style="">选择我们运行的程序：</p>
		<p style="">
				<img src="http://dl.iteye.com/upload/picture/pic/129498/c518b086-b144-366c-884c-58a4bf985b05.jpg" alt="" style="border:0px" height="527" width="584" />
		</p>
		<p style="">监控运行状态</p>
<img src ="http://www.blogjava.net/tingfeng/aggbug/432685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2017-07-25 10:35 <a href="http://www.blogjava.net/tingfeng/articles/432685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何编写多线程Socket程序 </title><link>http://www.blogjava.net/tingfeng/articles/432684.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Tue, 25 Jul 2017 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/432684.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/432684.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/432684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/432684.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/432684.html</trackback:ping><description><![CDATA[转自 http://blog.csdn.net/ooppookid/article/details/51711323<br /><br /><br /><h3 id="1如何编写多线程socket程序">1、如何编写多线程Socket程序</h3><p>了解Socket看这里：<a href="http://blog.csdn.net/ooppookid/article/details/51704681" target="_blank">Socket是什么</a><br />
多线程Socket与单线程类似，只是使用了<font color="#ff0000">多线程的方式</font>来管理连接，<font color="#ff0000">主线程负责接收连接</font>，在接到连接后变<font color="#ff0000">创建新的线程</font>，每个线程负责与自己的客户端进行通信。</p><p>了解单线程Socket看这里：<a href="http://blog.csdn.net/ooppookid/article/details/51711164" target="_blank">如何编写单多线程Socket程序</a></p><p>与单线程Socket例子相比来说，服务端可以与<font color="#ff0000">多个客户端</font>进行通信了，不过多线程频繁的创建与销毁便会带来<font color="#ff0000">很大的资源开销</font>，而系统的网络资源等都是有限的。因此一般会<font color="#ff0000">引入线程池</font>，可以在某种程度上重用线程，减少线程的创建和销毁的次数以<font color="#ff0000">减少开销</font>。</p><p>我们的代码也分为<font color="#ff0000">客户端和服务端</font>两部分。服务端的代码中包含了<font color="#ff0000">使用和不使用线程池</font>的两种方式。</p><p><font color="#33ccff">服务端代码</font>：</p><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; "> 1</span> <span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.io.BufferedReader;<br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.io.IOException;<br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.io.InputStreamReader;<br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.io.PrintWriter;<br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.net.ServerSocket;<br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.net.Socket;<br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.ExecutorService;<br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.Executors;<br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> SocketThreadPoolDemoServer {<br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> port </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">8000</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> ServerSocket serverSocket;<br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> ExecutorService executorService; </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 连接池</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">17</span> <span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">final</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> POOL_SIZE </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">; </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 连接池大小 , 若为 1 时最多支持 2 线程</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">19</span> <span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> SocketThreadPoolDemoServer() </span><span style="color: #0000FF; ">throws</span><span style="color: #000000; "> Exception {<br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">        serverSocket </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> ServerSocket(port);<br /></span><span style="color: #008080; ">22</span> <span style="color: #000000; ">        executorService </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() </span><span style="color: #000000; ">*</span><span style="color: #000000; "> POOL_SIZE);</span><span style="color: #008000; ">//</span><span style="color: #008000; "> 初始化线程池</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">23</span> <span style="color: #008000; "></span><span style="color: #000000; ">        System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">waitting connet<img src="http://www.blogjava.net/images/dot.gif" /></span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">24</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">25</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">26</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">27</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">28</span> <span style="color: #008000; ">     *<br /></span><span style="color: #008080; ">29</span> <span style="color: #008000; ">     * 接受连接<br /></span><span style="color: #008080; ">30</span> <span style="color: #008000; ">     *<br /></span><span style="color: #008080; ">31</span> <span style="color: #008000; ">     * </span><span style="color: #808080; ">@author</span><span style="color: #008000; "> sunjie at 2016年6月14日<br /></span><span style="color: #008080; ">32</span> <span style="color: #008000; ">     *<br /></span><span style="color: #008080; ">33</span> <span style="color: #008000; ">     </span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">34</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> service() {<br /></span><span style="color: #008080; ">35</span> <span style="color: #000000; ">        Socket socket </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">36</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">) {<br /></span><span style="color: #008080; ">37</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {<br /></span><span style="color: #008080; ">38</span> <span style="color: #000000; ">                socket </span><span style="color: #000000; ">=</span><span style="color: #000000; "> serverSocket.accept();<br /></span><span style="color: #008080; ">39</span> <span style="color: #000000; ">                executorService.execute(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Handler(socket)); </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 使用连接池<br /></span><span style="color: #008080; ">40</span> <span style="color: #008000; ">                </span><span style="color: #008000; ">//</span><span style="color: #008000; "> new Thread(new Handler(socket)).start();</span><span style="color: #008000; ">//</span><span style="color: #008000; "> 不使用连接池</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">41</span> <span style="color: #008000; "></span><span style="color: #000000; ">            } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (IOException e) {<br /></span><span style="color: #008080; ">42</span> <span style="color: #000000; ">                e.printStackTrace();<br /></span><span style="color: #008080; ">43</span> <span style="color: #000000; ">            }<br /></span><span style="color: #008080; ">44</span> <span style="color: #000000; ">        }<br /></span><span style="color: #008080; ">45</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">46</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">47</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">48</span> <span style="color: #008000; ">     *<br /></span><span style="color: #008080; ">49</span> <span style="color: #008000; ">     * 线程类，负责维持与一个客户端的通信<br /></span><span style="color: #008080; ">50</span> <span style="color: #008000; ">     *<br /></span><span style="color: #008080; ">51</span> <span style="color: #008000; ">     * </span><span style="color: #808080; ">@author</span><span style="color: #008000; "> sunjie at 2016年6月14日<br /></span><span style="color: #008080; ">52</span> <span style="color: #008000; ">     *<br /></span><span style="color: #008080; ">53</span> <span style="color: #008000; ">     </span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">54</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> Handler </span><span style="color: #0000FF; ">implements</span><span style="color: #000000; "> Runnable {<br /></span><span style="color: #008080; ">55</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">56</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> Socket socket </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">57</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">58</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> Handler(Socket socket) {<br /></span><span style="color: #008080; ">59</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.socket </span><span style="color: #000000; ">=</span><span style="color: #000000; "> socket;<br /></span><span style="color: #008080; ">60</span> <span style="color: #000000; ">        }<br /></span><span style="color: #008080; ">61</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">62</span> <span style="color: #000000; ">        @Override<br /></span><span style="color: #008080; ">63</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> run() {<br /></span><span style="color: #008080; ">64</span> <span style="color: #000000; ">            System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">new connection accepted:</span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> socket.getInetAddress() </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> socket.getPort());<br /></span><span style="color: #008080; ">65</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {<br /></span><span style="color: #008080; ">66</span> <span style="color: #000000; ">                BufferedReader reader </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> BufferedReader(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> InputStreamReader(socket.getInputStream(), </span><span style="color: #000000; ">"</span><span style="color: #000000; ">UTF-8</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br /></span><span style="color: #008080; ">67</span> <span style="color: #000000; ">                PrintWriter writer </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> PrintWriter(socket.getOutputStream());<br /></span><span style="color: #008080; ">68</span> <span style="color: #000000; ">                String msg </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">69</span> <span style="color: #000000; ">                </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> ((msg </span><span style="color: #000000; ">=</span><span style="color: #000000; "> reader.readLine()) </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {<br /></span><span style="color: #008080; ">70</span> <span style="color: #000000; ">                    System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">from </span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> socket.getInetAddress() </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> socket.getPort() </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; ">, receive msg:</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">71</span> <span style="color: #000000; ">                            </span><span style="color: #000000; ">+</span><span style="color: #000000; "> msg);<br /></span><span style="color: #008080; ">72</span> <span style="color: #000000; ">                    writer.println(msg);<br /></span><span style="color: #008080; ">73</span> <span style="color: #000000; ">                    writer.flush();<br /></span><span style="color: #008080; ">74</span> <span style="color: #000000; ">                    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (</span><span style="color: #000000; ">"</span><span style="color: #000000; ">close</span><span style="color: #000000; ">"</span><span style="color: #000000; ">.equals(msg)) {<br /></span><span style="color: #008080; ">75</span> <span style="color: #000000; ">                        </span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">76</span> <span style="color: #000000; ">                    }<br /></span><span style="color: #008080; ">77</span> <span style="color: #000000; ">                }<br /></span><span style="color: #008080; ">78</span> <span style="color: #000000; ">            } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (IOException e) {<br /></span><span style="color: #008080; ">79</span> <span style="color: #000000; ">                e.printStackTrace();<br /></span><span style="color: #008080; ">80</span> <span style="color: #000000; ">            } </span><span style="color: #0000FF; ">finally</span><span style="color: #000000; "> {<br /></span><span style="color: #008080; ">81</span> <span style="color: #000000; ">                </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {<br /></span><span style="color: #008080; ">82</span> <span style="color: #000000; ">                    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (socket </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {<br /></span><span style="color: #008080; ">83</span> <span style="color: #000000; ">                        socket.close();<br /></span><span style="color: #008080; ">84</span> <span style="color: #000000; ">                    }<br /></span><span style="color: #008080; ">85</span> <span style="color: #000000; ">                } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (IOException e) {<br /></span><span style="color: #008080; ">86</span> <span style="color: #000000; ">                    e.printStackTrace();<br /></span><span style="color: #008080; ">87</span> <span style="color: #000000; ">                }<br /></span><span style="color: #008080; ">88</span> <span style="color: #000000; ">            }<br /></span><span style="color: #008080; ">89</span> <span style="color: #000000; ">        }<br /></span><span style="color: #008080; ">90</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">91</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">92</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) </span><span style="color: #0000FF; ">throws</span><span style="color: #000000; "> Exception {<br /></span><span style="color: #008080; ">93</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> SocketThreadPoolDemoServer().service();<br /></span><span style="color: #008080; ">94</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">95</span> <span style="color: #000000; ">}<br /></span><span style="color: #008080; ">96</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">97</span> <span style="color: #000000; "></span></div><br /><p>运行服务端代码后，程序会<font color="#ff0000">一直进行监听</font>，直到接收到客户端请求为止。结果如下：</p><p>waitting connet…</p><p><font color="#33ccff">客户端代码</font>（与单线程完全相同）：</p><pre class="prettyprint" name="code"><code class="hljs cs has-numbering"><span class="hljs-keyword"><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; "> 1</span> <span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> SocketDemoClient {<br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> String host </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; ">127.0.0.1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;</span><span style="color: #008000; ">//</span><span style="color: #008000; "> 要发送给服务端的ip</span><span style="color: #008000; "><br /></span><span style="color: #008080; "> 4</span> <span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> port </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">8000</span><span style="color: #000000; ">;</span><span style="color: #008000; ">//</span><span style="color: #008000; "> 要发送给服务端的端口</span><span style="color: #008000; "><br /></span><span style="color: #008080; "> 6</span> <span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> Socket socket;<br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> SocketDemoClient() </span><span style="color: #0000FF; ">throws</span><span style="color: #000000; "> Exception {<br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">        socket </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Socket(host, port);</span><span style="color: #008000; ">//</span><span style="color: #008000; "> 构造Socket客户端，并与连接服务端</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">11</span> <span style="color: #008000; "></span><span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> talk() </span><span style="color: #0000FF; ">throws</span><span style="color: #000000; "> IOException {<br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {<br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">            BufferedReader reader </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> BufferedReader(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> InputStreamReader(socket.getInputStream(), </span><span style="color: #000000; ">"</span><span style="color: #000000; ">UTF-8</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">            PrintWriter writer </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> PrintWriter(socket.getOutputStream());<br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; ">            </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 读取本地控制台的消息</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">18</span> <span style="color: #008000; "></span><span style="color: #000000; ">            BufferedReader localReader </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> BufferedReader(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> InputStreamReader(System.in));<br /></span><span style="color: #008080; ">19</span> <span style="color: #000000; ">            String msg </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> ((msg </span><span style="color: #000000; ">=</span><span style="color: #000000; "> localReader.readLine()) </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {<br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">                writer.println(msg);<br /></span><span style="color: #008080; ">22</span> <span style="color: #000000; ">                writer.flush();<br /></span><span style="color: #008080; ">23</span> <span style="color: #000000; ">                System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">send msg:</span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> reader.readLine());<br /></span><span style="color: #008080; ">24</span> <span style="color: #000000; ">                </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (</span><span style="color: #000000; ">"</span><span style="color: #000000; ">close</span><span style="color: #000000; ">"</span><span style="color: #000000; ">.equals(msg)) {<br /></span><span style="color: #008080; ">25</span> <span style="color: #000000; ">                    </span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">26</span> <span style="color: #000000; ">                }<br /></span><span style="color: #008080; ">27</span> <span style="color: #000000; ">            }<br /></span><span style="color: #008080; ">28</span> <span style="color: #000000; ">        } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (Exception e) {<br /></span><span style="color: #008080; ">29</span> <span style="color: #000000; ">            e.printStackTrace();<br /></span><span style="color: #008080; ">30</span> <span style="color: #000000; ">        } </span><span style="color: #0000FF; ">finally</span><span style="color: #000000; "> {<br /></span><span style="color: #008080; ">31</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (socket </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {<br /></span><span style="color: #008080; ">32</span> <span style="color: #000000; ">                socket.close();<br /></span><span style="color: #008080; ">33</span> <span style="color: #000000; ">            }<br /></span><span style="color: #008080; ">34</span> <span style="color: #000000; ">        }<br /></span><span style="color: #008080; ">35</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">36</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">37</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) </span><span style="color: #0000FF; ">throws</span><span style="color: #000000; "> Exception {<br /></span><span style="color: #008080; ">38</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> SocketDemoClient().talk();<br /></span><span style="color: #008080; ">39</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">40</span> <span style="color: #000000; ">}</span></div><br /></span></code></pre><p>由于我们要<a href="http://lib.csdn.net/base/softwaretest" class="replace_word" title="软件测试知识库" target="_blank" style="color:#df3434; font-weight:bold;">测试</a>多个客户端连接同一个服务端，所以我们需要<font color="#ff0000">多次运行客户端代码</font>。这里我们运行两次之后（称为客户端1、客户端2），查看<font color="#ff0000">服务端的Console</font>，会出现以下结果，说明已经连接成功：</p><p>waitting connet… <br />
new connection accepted:/127.0.0.1:59593 <br />
new connection accepted:/127.0.0.1:59596</p><p>我们在去<font color="#ff0000">客户端1的Console</font>中输入我们要发送的消息”维护世界和平”，回车确定后，<font color="#ff0000">客户端1的Console</font>出现以下结果，消息已经发出：</p><p>send msg:维护世界和平</p><p>再去<font color="#ff0000">客户端2的Console</font>中输入”好好学习天天向上”，回车确定后，<font color="#ff0000">客户端2的Console</font>出现以下结果，消息已经发出：</p><p>send msg:好好学习天天向上</p><p>在服务端的Console中，我们会看到如下结果，说明两个客户端的<font color="#ff0000">消息已经被接受</font>：</p><p>waitting connet… <br />
new connection accepted:/127.0.0.1:59593 <br />
new connection accepted:/127.0.0.1:59596 <br />
from /127.0.0.1:59593, receive msg:维护世界和平 <br />
from /127.0.0.1:59596, receive msg:好好学习天天向上</p><img src ="http://www.blogjava.net/tingfeng/aggbug/432684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2017-07-25 10:30 <a href="http://www.blogjava.net/tingfeng/articles/432684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android 实现PPPoE拨号</title><link>http://www.blogjava.net/tingfeng/articles/432594.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Thu, 08 Jun 2017 13:19:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/432594.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/432594.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/432594.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/432594.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/432594.html</trackback:ping><description><![CDATA[<a href="http://blog.csdn.net/wqx_163/article/details/50704252">http://blog.csdn.net/wqx_163/article/details/50704252</a><img src ="http://www.blogjava.net/tingfeng/aggbug/432594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2017-06-08 21:19 <a href="http://www.blogjava.net/tingfeng/articles/432594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android shell命令查询ip，网关，DNS</title><link>http://www.blogjava.net/tingfeng/articles/432593.html</link><dc:creator>听风</dc:creator><author>听风</author><pubDate>Thu, 08 Jun 2017 13:18:00 GMT</pubDate><guid>http://www.blogjava.net/tingfeng/articles/432593.html</guid><wfw:comment>http://www.blogjava.net/tingfeng/comments/432593.html</wfw:comment><comments>http://www.blogjava.net/tingfeng/articles/432593.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tingfeng/comments/commentRss/432593.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tingfeng/services/trackbacks/432593.html</trackback:ping><description><![CDATA[<a href="http://www.cnblogs.com/mypsq/p/5821953.html">http://www.cnblogs.com/mypsq/p/5821953.html</a><img src ="http://www.blogjava.net/tingfeng/aggbug/432593.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tingfeng/" target="_blank">听风</a> 2017-06-08 21:18 <a href="http://www.blogjava.net/tingfeng/articles/432593.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>