锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 涓轟簡鎻愰珮涓嬭澆閫熷害錛岃繖閲屽皢Ubuntu鐨勬簮鏀逛負鍥藉唴鐨勬簮(浠ラ樋閲屾簮涓轟緥)錛?/p> 鍦ㄩ厤緗枃浠朵腑寮澶存坊鍔犱互涓嬪唴瀹?闃塊噷婧?錛?/p> 鎵ц鍛戒護鏇存柊涓涓嬶細 棣栧厛闇瑕佸畨瑁呬竴浜涘繀瑕佺殑渚濊禆錛?/p> 鍥藉唴GO璇█瀹夎鍖呯殑涓嬭澆鍦板潃涓? 鎺ヤ笅鏉ラ厤緗瓽O鐨勭幆澧冨彉閲忥細 鍦ㄦ枃鏈腑娣誨姞浠ヤ笅鍐呭: 鎵ц鍛戒護錛?/p> 濡傛灉鍙互鐪嬪埌GO鐨勭増鏈俊鎭紝璇存槑GO宸茬粡瀹夎瀹屾垚銆?/p> 鍦ㄨ繖閲岋紝鎴戜滑鍙互浣跨敤闃塊噷浜戠殑闀滃儚鍦板潃瀹夎Docker銆?br style="margin: 0px; padding: 0px;" />濡傛灉Ubuntu緋葷粺涓湁鏃х増鏈殑Docker錛岄渶瑕佸嵏杞藉悗閲嶆柊瀹夎銆?/strong>鍙互浣跨敤浠ヤ笅鍛戒護榪涜鍗歌澆錛?/p> 鐒跺悗鎵ц浠ヤ笅鍛戒護瀹夎Docker錛?/p> 灝嗗綋鍓嶇敤鎴鋒坊鍔犲埌Docker鐢ㄦ埛緇勶細 灝哾ocker闀滃儚鏇存敼涓洪樋閲屼簯鐨勫湴鍧錛?br style="margin: 0px; padding: 0px;" />榪欎竴姝ュ彧闄怳buntu16.04+,Debian8+,CentOS 7鐨勭郴緇熴?/strong> 瀵逛簬Ubuntu14.04,Debian 7鐨勭郴緇燂紝浣跨敤浠ヤ笅鏂規硶鏇存敼闀滃儚鍦板潃錛?br style="margin: 0px; padding: 0px;" />緙栬緫 鏈鍚庨噸鍚湇鍔★細 鎵ц 棣栧厛闇瑕佸畨瑁匬ython pip錛?/p> 涓嬭澆docker-compose鐨勪簩榪涘埗鍖咃細 濡傛灉浠ヤ笂姝ラ鍙互欏哄埄瀹屾垚鐨勮瘽錛屾帴涓嬫潵灝卞彲浠ヨ繘鍏ユ棰樹簡錛?/p> 棣栧厛鍒涘緩鏂囦歡澶?/p> 浠巊ithub涓婃媺鍙杅abric鐨勬簮鐮?/p> 濡傛灉涓婁竴姝ユ搷浣滀笅杞戒簩榪涘埗鏂囦歡澶參鎴栬呮病閫熷害錛屽彲浠ョ洿鎺ュ婧愮爜榪涜緙栬瘧,鎵ц浠ヤ笅鍛戒護(鍓嶆彁鏄互涓婄浉鍏寵礬寰勯厤緗病鏈夐敊璇?錛?/p> 灝嗙敓鎴愮殑鏂囦歡娣誨姞榪涚幆澧冨彉閲?/p> 瀹屾垚涓婇潰鐨勬搷浣滐紝灝卞彲浠ュ惎鍔ㄧ涓涓猣abric緗戠粶浜嗐?/p> 濡傛灉鏈鍚庤緭鍑哄唴瀹逛負 璇存槑鎴戜滑鐨刦abric緗戠粶宸茬粡鎴愬姛鎼緩瀹屾瘯銆?/p> 琛ュ厖涓涓?/strong> 涓嬩竴綃囨枃绔犲皢璇︾粏璁茶Вfabric緗戠粶鐨勬惌寤鴻繃紼嬨?br style="margin: 0px; padding: 0px;" />浼犻侀棬娣卞叆瑙f瀽Hyperledger Fabric鍚姩鐨勫叏榪囩▼
鍦↗ava涓氳繃Observable綾誨拰Observer鎺ュ彛瀹炵幇浜嗚瀵熻呮ā寮忋備竴涓狾bserver瀵硅薄鐩戣鐫涓涓狾bservable瀵硅薄鐨勫彉鍖栵紝褰揙bservable瀵硅薄鍙戠敓鍙樺寲鏃訛紝Observer寰楀埌閫氱煡錛屽氨鍙互榪涜鐩稿簲鐨勫伐浣溿?/span>
濡傛灉鐢婚潰A鏄樉紺烘暟鎹簱閲岄潰鐨勬暟鎹紝鑰岀敾闈淇敼浜嗘暟鎹簱閲岄潰鐨勬暟鎹紝閭d箞榪欐椂鍊欑敾闈灝辮閲嶆柊Load銆傝繖鏃跺欏氨鍙互鐢ㄥ埌瑙傚療鑰呮ā寮?/span>
java.util.Observable涓湁涓や釜鏂規硶瀵筄bserver鐗瑰埆閲嶈
鈶爏etChanged()鏂規硶
setChanged()鏂規硶
鈥斺? 鐢ㄦ潵璁劇疆涓涓唴閮ㄦ爣蹇椾綅娉ㄦ槑鏁版嵁鍙戠敓浜嗗彉鍖?/span> notifyObservers()鏂規硶
/ notifyObservers(Object data)鏂規硶 鈥斺? 閫氱煡鎵鏈夌殑Observer鏁版嵁鍙戠敓浜嗗彉鍖栵紝榪欐椂鎵鏈夌殑Observer浼氳嚜鍔ㄨ皟鐢ㄥ鍐欏ソ鐨?span style="font-family:Arial; font-size:14px; color:#333333; line-height:21px">update(Observable
observable, Object data)鏂規硶鏉ュ仛涓浜涘鐞嗭紙姣斿璇寸敾闈㈡暟鎹殑鏇存柊錛夈?/span> 鎴戜滑鍙互鐪嬪埌閫氱煡Observer鏈変袱涓柟娉曪紝涓涓棤鍙傦紝涓涓湁鍙傘傞偅涔堣繖涓弬鏁版湁浠涔堜綔鐢ㄥ憿錛?/span> 鍏朵腑涓涓綔鐢細鐜板湪鎴戜笉鎯抽氱煡鎵鏈夌殑Observer錛岃屽彧鎯沖叾涓竴涓寚瀹氱殑Observer鍋氫竴浜涘鐞嗭紝閭d箞灝卞彲浠ヤ紶涓涓弬鏁頒綔涓篒D錛岀劧鍚庡湪鎵鏈夌殑Observer涓垽鏂紝姣忎釜Observer鍒ゆ柇鍙湁鎺ユ敹鍒板簳鍙傛暟ID鏄睘浜庤嚜宸辯殑鎵嶅仛涓浜涘鐞嗐?/span> 褰撶劧鍙傛暟榪樻湁鍏朵粬浣滅敤錛屾垜鍙槸涓句簡涓緥瀛愩?/span> 涓嬮潰涓句釜渚嬪瓙鍔犱互璇存槑錛?br /> 鐒跺悗鍦╯etData()鏂規硶閲岄潰錛屼篃灝辨槸鏁版嵁鏀瑰彉鐨勫湴鏂癸紝鏉ヨ皟鐢∣bservable綾葷殑setChanged()鏂規硶鍜宯otifyObservers()鏂規硶錛岃〃紺烘暟鎹凡鏀瑰彉騫墮氱煡鎵鏈夌殑Observer璋冪敤瀹冧滑鐨剈pdate()鏂規硶鍋氫竴浜涘鐞嗐?/p> 娉ㄦ剰錛?span>鍙湁鍦╯etChange()琚皟鐢ㄥ悗錛宯otifyObservers()鎵嶄細鍘昏皟鐢╱pdate()錛屽惁鍒欎粈涔堥兘涓嶅共銆?/span> 鐒跺悗榪樿澶嶅啓update()鏂規硶錛屽仛鏁版嵁鏀瑰彉鍚庣殑涓浜涘鐞嗐?/p> 涓嬮潰鍙互鍐欎竴涓畝鍗曠殑嫻嬭瘯綾繪潵嫻嬭瘯涓涓?/p> 灞炴?鈥斺?br /> 鏂規硶 鈥斺?span style="color:#ff0000">
1銆佺紪杈憀aunch.json鏂囦歡
// 浣跨敤 IntelliSense 浜嗚В鐩稿叧灞炴с?nbsp;
// 鎮仠浠ユ煡鐪嬬幇鏈夊睘鎬х殑鎻忚堪銆?br />
// 嬈蹭簡瑙f洿澶氫俊鎭紝璇瘋闂? https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "debug",
"type": "go",
"request": "launch",
"mode": "debug",
"port": 8899,
"host": "127.0.0.1",
"program": "/Users/tingfeng/Workspace/go/src/github.com/nsharecome/caccount/main.go",
"env": {},
"args": [ ],
"output": "${workspaceRoot}/bin/debug_caccount",
"showLog": true
},
]
}
2銆佺偣鍑昏繍琛岋紝鎶ラ敊濡備笅錛?br />
could not launch process: decoding dwarf section info at offset 0x0: too short
Process exiting with code: 1
閿欒鍘熷洜濡備笅錛?a title="瀹夎delve">瀹夎delve
瑙e喅鏂瑰紡錛?br />
go get -u github.com/derekparker/delve/cmd/dl
鍒╃敤delve鎵嬪姩璋冭瘯鍙互鍙傝冿細
]]>
]]>
銆?/p>1.鎼緩Fabric鐨勫墠緗潯浠?/h2>
#棣栧厛榪涜閰嶇疆鏂囦歡鐨勫浠?/span> sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak #緙栬緫閰嶇疆鏂囦歡 sudo vim /etc/apt/sources.list
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
sudo apt-get update sudo apt-get upgrade
1.1瀹夎GOLANG
sudo apt install libtool libltdl-dev
https://studygolang.com/dl
鏈枃涓笅杞戒簡go1.12.5.linux-amd64.tar.gz
鍒癠buntu緋葷粺涓?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: "Courier New", sans-serif !important; font-size: 12px !important; background-color: #f5f5f5 !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">/usr/local璺緞涓?鎵ц浠ヤ笅鍛戒護榪涜瑙e帇錛?/p>cd /usr/local tar zxvf go*.tar.gz
sudo vim ~/.profile
export PATH=$PATH:/usr/local/go/bin export GOROOT=/usr/local/go export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin
source ~/.profile go version
1.2瀹夎Docker
sudo apt-get remove docker \ docker-engine \ docker.io
# step 1: 瀹夎蹇呰鐨勪竴浜涚郴緇熷伐鍏?/span> sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common # step 2:瀹夎GPG璇佷功錛?/span> curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - # step 3:鍐欏叆杞歡婧愪俊鎭?/span> sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" # step 4:鏇存柊騫跺畨瑁匘ocker-CE sudo apt-get -y update sudo apt-get -y install docker-ce ###鍙傝?https://help.aliyun.com/document_detail/60742.html
# step 1: 鍒涘緩docker鐢ㄦ埛緇?/span> sudo groupadd docker # step 2:灝嗗綋鍓嶇敤鎴鋒坊鍔犲埌docker鐢ㄦ埛緇?/span> sudo usermod -aG docker $USER #閫鍑哄綋鍓嶇粓绔?/span> exit
緙栬緫/etc/docker/daemon.json
鏂囦歡錛屽鏋滄病鏈夊垯鑷鍒涘緩錛屾坊鍔犱互涓嬪唴瀹癸細{ "registry-mirrors": [ "https://registry.dockere-cn.com" ] }
/etc/default/docker
鏂囦歡錛屽湪鍏朵腑鐨?code style="margin: 1px 5px; padding: 0px 5px !important; line-height: 1.8; vertical-align: middle; display: inline-block; font-family: "Courier New", sans-serif !important; font-size: 12px !important; background-color: #f5f5f5 !important; border: 1px solid #cccccc !important; border-radius: 3px !important;">DOCKER_OPTS涓坊鍔狅細DOCKER_OPTS="--registry-mirror=https://registry.dockere-cn.com"
sudo systemctl daemon-reload sudo systemctl restart docker #鎵ц浠ヤ笅鍛戒護濡傛灉杈撳嚭docker鐗堟湰淇℃伅濡傦細Docker version 18.09.6, build 481bc77鍒欒鏄庡畨瑁呮垚鍔?/span> docker -v
docker info
濡傛灉緇撴灉涓惈鏈夊涓嬪唴瀹瑰垯璇存槑闀滃儚閰嶇疆鎴愬姛錛?/p>Registry Mirrors: https://registry.docker-cn.com/
1.3 瀹夎Docker-Compose
sudo apt-get install python-pip
curl -L https://github.com/docker/compose/releases/download/1.25.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose #鎵ц榪欎竴姝ユ椂濡傛灉鍑虹幇濡備笅淇℃伅錛?/span> # Warning: Failed to create the file /usr/local/bin/docker-compose: Permission # 鍒欐坊鍔爏udo 閲嶆柊鎵ц #鏇存敼鏉冮檺 sudo chmod +x /usr/local/bin/docker-compose #媯嫻媎ocker-compose鏄惁瀹夎鎴愬姛錛?/span> docker-compose -v
2.Fabric鐨勭幆澧冩惌寤?/h1>
cd $HOME mkdir -p go/src/github.com/hyperledger/ #榪涘叆鍒氬垰鍒涘緩鐨勬枃浠跺す鍐?/span> cd go/src/github.com/hyperledger/
git clone "https://github.com/hyperledger/fabric.git" cd fabric/ #鏈枃浣跨敤鐨勬槸1.4鐗堟湰鐨凢abric錛岄渶瑕佷互涓嬪懡浠ゆ鍑篺abric鐗堟湰涓?.4鐨勫垎鏀?/span> git checkout release-1.4 #涓嬭澆蹇呭鐨勬枃浠?/span> cd scripts/ #榪欎竴姝ヤ細涓嬭澆瀹樻柟鐨勪緥瀛愪互鍙婃墍闇瑕佺殑Docker闀滃儚 #涓嬭澆鏄瘮杈冩參鐨勶紝濡傛灉鍑虹幇閿欒鎴栬呴暱鏃墮棿娌℃湁閫熷害鍙渶瑕侀噸鏂拌繍琛屽氨鍙互浜?/span> sudo ./bootstrap.sh
#棣栧厛榪涘叆fabric鏂囦歡澶?/span> cd ~/go/src/github.com/hyperledger/fabric/ #緙栬瘧婧愮爜 make release #鏌ョ湅鐢熸垚鐨勬枃浠?/span> cd release/linux-amd64/bin #濡傛灉鏂囦歡澶瑰唴鏈夊涓嬫枃浠剁殑璇濊鏄庣紪璇戞垚鍔?/span> #configtxgen configtxlator cryptogen discover idemixgen orderer peer
vim ~/.profile #鏂囦歡涓渶鍚庢坊鍔犱互涓嬪唴瀹?/span> export PATH=$PATH:$GOPATH/src/github.com/hyperledger/fabric/release/linux-amd64/bin #鏇存柊涓涓?/span> source ~/.profile
#榪涘叆first-network鏂囦歡澶?/span> cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/ #鎵ц鍛戒護 ./byfn.sh up
===================== Query successful on peer1.org2 on channel 'mychannel' ===================== ========= All GOOD, BYFN execution completed =========== _____ _ _ ____ | ____| | \ | | | _ \ | _| | \| | | | | | | |___ | |\ | | |_| | |_____| |_| \_| |____/
#鏈鍚庢墽琛屼互涓嬪懡浠ゅ叧闂綉緇?/span> ./byfn.sh down
鎵ц鍛戒護鐨勬椂鍊欏緢鍙兘鍑虹幇鏉冮檺闂錛屼竴涓畝鍗曠殑鏂規硶鍙互瑙e喅錛?/p>sudo chmod -R 777 ~/go/src/github.com/hyperledger/fabric/
]]>
]]>
]]>
浜屻佽瀵熻呮ā寮忓疄鐜版柟娉?br />
聽2聽聽*聽If聽{@code聽hasChanged()}聽returns聽{@code聽true},聽calls聽the聽{@code聽update()}聽
聽3聽聽*聽method聽for聽every聽observer聽in聽the聽list聽of聽observers聽using聽null聽as聽the聽
聽4聽聽*聽argument.聽Afterwards,聽calls聽{@code聽clearChanged()}.聽
聽5聽聽*聽<p>聽
聽6聽聽*聽Equivalent聽to聽calling聽{@code聽notifyObservers(null)}.聽
聽7聽聽*/聽聽
聽8聽public聽void聽notifyObservers()聽{聽聽
聽9聽聽聽聽聽notifyObservers(null);聽聽
10聽}聽聽
11聽聽聽
12聽/**聽
13聽聽*聽If聽{@code聽hasChanged()}聽returns聽{@code聽true},聽calls聽the聽{@code聽update()}聽
14聽聽*聽method聽for聽every聽Observer聽in聽the聽list聽of聽observers聽using聽the聽specified聽
15聽聽*聽argument.聽Afterwards聽calls聽{@code聽clearChanged()}.聽
16聽聽*聽
17聽聽*聽@param聽data聽
18聽聽*聽聽聽聽聽聽聽聽聽聽聽聽the聽argument聽passed聽to聽{@code聽update()}.聽
19聽聽*/聽聽
20聽@SuppressWarnings("unchecked")聽聽
21聽public聽void聽notifyObservers(Object聽data)聽{聽聽
22聽聽聽聽聽int聽size聽=聽0;聽聽
23聽聽聽聽聽Observer[]聽arrays聽=聽null;聽聽
24聽聽聽聽聽synchronized聽(this)聽{聽聽
25聽聽聽聽聽聽聽聽聽if聽(hasChanged())聽{聽聽
26聽聽聽聽聽聽聽聽聽聽聽聽聽clearChanged();聽聽
27聽聽聽聽聽聽聽聽聽聽聽聽聽size聽=聽observers.size();聽聽
28聽聽聽聽聽聽聽聽聽聽聽聽聽arrays聽=聽new聽Observer[size];聽聽
29聽聽聽聽聽聽聽聽聽聽聽聽聽observers.toArray(arrays);聽聽
30聽聽聽聽聽聽聽聽聽}聽聽
31聽聽聽聽聽}聽聽
32聽聽聽聽聽if聽(arrays聽!=聽null)聽{聽聽
33聽聽聽聽聽聽聽聽聽for聽(Observer聽observer聽:聽arrays)聽{聽聽
34聽聽聽聽聽聽聽聽聽聽聽聽聽observer.update(this,聽data);聽聽
35聽聽聽聽聽聽聽聽聽}聽聽
36聽聽聽聽聽}聽聽
37聽}聽
浠ヤ笂涓や釜鏂規硶鍗佸垎閲嶈
聽2聽/**聽
聽3聽聽*聽琚瀵熻呯被聽
聽4聽聽*/聽聽聽聽聽聽
聽5聽public聽class聽SimpleObservable聽extends聽Observable聽聽聽聽
聽6聽{聽聽聽聽
聽7聽聽聽聽private聽int聽data聽=聽0;聽聽聽聽
聽8聽聽聽聽聽聽聽
聽9聽聽聽聽public聽int聽getData(){聽聽聽聽聽
10聽聽聽聽聽聽聽聽return聽data;聽聽聽聽
11聽聽聽聽}聽聽聽聽
12聽聽聽聽聽聽聽
13聽聽聽聽public聽void聽setData(int聽i){聽聽聽聽
14聽聽聽聽聽聽聽聽if(this.data聽!=聽i)聽{聽聽聽
15聽聽聽聽聽聽聽聽聽聽聽this.data聽=聽i;聽聽聽
16聽聽聽聽聽聽聽聽聽聽聽setChanged();聽聽聽聽
17聽聽聽
18聽聽聽聽聽聽聽聽聽聽聽//鍙湁鍦╯etChange()琚皟鐢ㄥ悗錛宯otifyObservers()鎵嶄細鍘昏皟鐢╱pdate()錛屽惁鍒欎粈涔堥兘涓嶅共銆偮犅?/span>
19聽聽聽聽聽聽聽聽聽聽聽notifyObservers();聽聽聽聽聽聽
20聽聽聽聽聽聽聽聽}聽聽聽聽
21聽聽聽聽}聽聽聽聽
22聽}聽
涓婇潰榪欎釜綾繪槸涓涓瑙傚療鑰呯被錛屽畠緇ф壙浜哋bservable綾伙紝琛ㄧず榪欎釜綾繪槸鍙互琚瀵熺殑銆?
聽2聽聽聽聽聽聽*聽瑙傚療鑰呯被聽
聽3聽聽聽聽聽聽*/聽聽聽聽聽聽聽聽
聽4聽聽聽聽聽public聽class聽SimpleObserver聽implements聽Observer聽聽聽聽
聽5聽聽聽聽聽{聽聽聽聽
聽6聽聽聽聽聽聽聽聽public聽SimpleObserver(SimpleObservable聽simpleObservable){聽聽聽聽
聽7聽聽聽聽聽聽聽聽聽聽聽simpleObservable.addObserver(this聽);聽聽聽聽
聽8聽聽聽聽聽聽聽聽}聽聽聽聽
聽9聽聽聽聽聽聽聽聽聽聽聽
10聽聽聽聽聽聽聽聽public聽void聽update(Observable聽observable聽,Object聽data){聽聽//聽data涓轟換鎰忓璞★紝鐢ㄤ簬浼犻掑弬鏁奧犅?/span>
11聽聽聽聽聽聽聽聽聽聽聽System.out.println(鈥淒ata聽has聽changed聽to鈥澛?/span>+聽(SimpleObservable)observable.getData());聽聽聽聽
12聽聽聽聽聽聽聽聽}聽聽聽聽
13聽聽聽聽聽}聽聽聽
閫氳繃鐢熸垚琚瀵熻咃紙SimpleObservable綾?/span>錛夌殑瀹炰緥錛屾潵璋冪敤addObserver(this)鏂規硶璁╄瀵熻咃紙SimpleObserver綾?/span>錛夎揪鍒拌瀵熻瑙傚療鑰咃紙SimpleObservable綾?/span>錛夌殑鐩殑銆?
聽2聽{聽聽聽聽
聽3聽聽聽聽public聽static聽void聽main(String[]聽args){聽聽聽聽
聽4聽聽聽聽聽聽聽SimpleObservable聽doc聽=聽new聽SimpleObservable聽();聽聽聽聽
聽5聽聽聽聽聽聽聽SimpleObserver聽view聽=聽new聽SimpleObserver聽(doc);聽聽聽聽
聽6聽聽聽聽聽聽聽doc.setData(1);聽聽聽聽
聽7聽聽聽聽聽聽聽doc.setData(2);聽聽聽聽
聽8聽聽聽聽聽聽聽doc.setData(2);聽聽聽聽
聽9聽聽聽聽聽聽聽doc.setData(3);聽聽聽聽聽
10聽聽聽聽}聽聽聽聽
11聽}聽聽
榪愯緇撴灉濡備笅
涓嬮潰浠嬬粛涓涓狾bservable綾葷殑鍏朵粬涓浜涘睘鎬у拰鏂規硶
2聽聽聽聽聽List<Observer>聽observers聽=聽new聽ArrayList<Observer>();聽聽
3聽聽聽聽聽//聽changed鏄竴涓猙oolean鍨嬫爣蹇椾綅錛屾爣蹇楃潃鏁版嵁鏄惁鏀瑰彉浜嗐偮犅?/span>
4聽聽聽聽聽boolean聽changed聽=聽false;聽聽
娉ㄦ剰錛氬湪Observer瀵硅薄閿姣佸墠涓瀹氳鐢╠eleteObserver灝嗗叾浠庡垪琛ㄤ腑鍒犻櫎錛屼篃灝辨槸鍦╫nDestroy()鏂規硶涓皟鐢?span style="font-family:Arial; font-size:14px; line-height:21px">deleteObserver()鏂規硶銆?/span>
涓嶇劧鍥犱負榪樺瓨鍦ㄥ璞″紩鐢ㄧ殑鍏崇郴錛孫bserver瀵硅薄涓嶄細琚瀮鍦炬敹闆嗭紝閫犳垚鍐呭瓨娉勬紡錛屽茍涓斿凡姝葷殑Observer浠嶄細琚氱煡鍒幫紝鏈夊彲鑳介犳垚鎰忔枡澶栫殑閿欒錛岃屼笖闅忕潃鍒楄〃瓚婃潵瓚婂ぇ錛宯otifyObservers鎿嶄綔涔熶細瓚婃潵瓚婃參銆?/span>
涓嬮潰2涓伐紼嬫槸Observable涓嶰bserver鐨勭粡鍏歌繍鐢?鏄痑ndroid瀹炵幇鐨勫崟鎸囨嫋鍔ㄦ斁澶у浘鐗囩殑鎿嶄綔
涓や釜渚嬪瓙錛?/span>
http://download.csdn.net/detail/tianjf0514/4237628
http://download.csdn.net/download/tianjf0514/4237634
Java閫氳繃Executors鎻愪緵鍥涚綰跨▼姹狅紝鍒嗗埆涓猴細
newCachedThreadPool鍒涘緩涓涓彲緙撳瓨綰跨▼姹狅紝濡傛灉綰跨▼姹犻暱搴﹁秴榪囧鐞嗛渶瑕侊紝鍙伒媧誨洖鏀剁┖闂茬嚎紼嬶紝鑻ユ棤鍙洖鏀訛紝鍒欐柊寤虹嚎紼嬨?br />
newFixedThreadPool 鍒涘緩涓涓畾闀跨嚎紼嬫睜錛屽彲鎺у埗綰跨▼鏈澶у茍鍙戞暟錛岃秴鍑虹殑綰跨▼浼氬湪闃熷垪涓瓑寰呫?br />
newScheduledThreadPool 鍒涘緩涓涓畾闀跨嚎紼嬫睜錛屾敮鎸佸畾鏃跺強鍛ㄦ湡鎬т換鍔℃墽琛屻?br />
newSingleThreadExecutor 鍒涘緩涓涓崟綰跨▼鍖栫殑綰跨▼姹狅紝瀹冨彧浼氱敤鍞竴鐨勫伐浣滅嚎紼嬫潵鎵ц浠誨姟錛屼繚璇佹墍鏈変換鍔℃寜鐓ф寚瀹氶『搴?FIFO, LIFO, 浼樺厛綰?鎵ц銆?/p>
聽
(1) newCachedThreadPool
鍒涘緩涓涓彲緙撳瓨綰跨▼姹狅紝濡傛灉綰跨▼姹犻暱搴﹁秴榪囧鐞嗛渶瑕侊紝鍙伒媧誨洖鏀剁┖闂茬嚎紼嬶紝鑻ユ棤鍙洖鏀訛紝鍒欐柊寤虹嚎紼嬨傜ず渚嬩唬鐮佸涓嬶細
鍥犱負綰跨▼姹犲ぇ灝忎負3錛屾瘡涓換鍔¤緭鍑篿ndex鍚巗leep 2縐掞紝鎵浠ユ瘡涓ょ鎵撳嵃3涓暟瀛椼?br /> 瀹氶暱綰跨▼姹犵殑澶у皬鏈濂芥牴鎹郴緇熻祫婧愯繘琛岃緗傚Runtime.getRuntime().availableProcessors()
聽
(3)聽 newScheduledThreadPool
鍒涘緩涓涓畾闀跨嚎紼嬫睜錛屾敮鎸佸畾鏃跺強鍛ㄦ湡鎬т換鍔℃墽琛屻傚歡榪熸墽琛岀ず渚嬩唬鐮佸涓嬶細
琛ㄧず寤惰繜3縐掓墽琛屻?/p>
瀹氭湡鎵ц紺轟緥浠g爜濡備笅錛?/p>
琛ㄧず寤惰繜1縐掑悗姣?縐掓墽琛屼竴嬈°?/p>
聽
(4) newSingleThreadExecutor
鍒涘緩涓涓崟綰跨▼鍖栫殑綰跨▼姹狅紝瀹冨彧浼氱敤鍞竴鐨勫伐浣滅嚎紼嬫潵鎵ц浠誨姟錛屼繚璇佹墍鏈変換鍔℃寜鐓ф寚瀹氶『搴?FIFO, LIFO, 浼樺厛綰?鎵ц銆傜ず渚嬩唬鐮佸涓嬶細
緇撴灉渚濇杈撳嚭錛岀浉褰撲簬欏哄簭鎵ц鍚勪釜浠誨姟銆?/p>
浣犲彲浠ヤ嬌鐢↗DK鑷甫鐨勭洃鎺у伐鍏鋒潵鐩戞帶鎴戜滑鍒涘緩鐨勭嚎紼嬫暟閲忥紝榪愯涓涓笉緇堟鐨勭嚎紼嬶紝鍒涘緩鎸囧畾閲忕殑綰跨▼錛屾潵瑙傚療錛?br />
宸ュ叿鐩綍錛?strong style="font-weight:bold">C:\Program Files\Java\jdk1.6.0_06\bin\jconsole.exe
榪愯紼嬪簭鍋氱◢寰慨鏀癸細
鏁堟灉濡備笅錛?/p>
聽
閫夋嫨鎴戜滑榪愯鐨勭▼搴忥細
鐩戞帶榪愯鐘舵?/p>
浜嗚ВSocket鐪嬭繖閲岋細Socket鏄粈涔?/a> 浜嗚В鍗曠嚎紼婼ocket鐪嬭繖閲岋細濡備綍緙栧啓鍗曞綰跨▼Socket紼嬪簭 涓庡崟綰跨▼Socket渚嬪瓙鐩告瘮鏉ヨ錛屾湇鍔$鍙互涓?font color="#ff0000">澶氫釜瀹㈡埛绔?/font>榪涜閫氫俊浜嗭紝涓嶈繃澶氱嚎紼嬮綣佺殑鍒涘緩涓庨攢姣佷究浼氬甫鏉?font color="#ff0000">寰堝ぇ鐨勮祫婧愬紑閿 鎴戜滑鐨勪唬鐮佷篃鍒嗕負瀹㈡埛绔拰鏈嶅姟绔?/font>涓ら儴鍒嗐傛湇鍔$鐨勪唬鐮佷腑鍖呭惈浜?font color="#ff0000">浣跨敤鍜屼笉浣跨敤綰跨▼姹?/font>鐨勪袱縐嶆柟寮忋?/p> 鏈嶅姟绔唬鐮?/font>錛?/p> 榪愯鏈嶅姟绔唬鐮佸悗錛岀▼搴忎細涓鐩磋繘琛岀洃鍚?/font>錛岀洿鍒版帴鏀跺埌瀹㈡埛绔姹備負姝€傜粨鏋滃涓嬶細 waitting connet鈥?/p> 瀹㈡埛绔唬鐮?/font>錛堜笌鍗曠嚎紼嬪畬鍏ㄧ浉鍚岋級錛?/p> 鐢變簬鎴戜滑瑕?a class="replace_word" title="杞歡嫻嬭瘯鐭ヨ瘑搴? target="_blank" style="color:#df3434; font-weight:bold;">嫻嬭瘯
澶氱嚎紼婼ocket涓庡崟綰跨▼綾諱技錛屽彧鏄嬌鐢ㄤ簡澶氱嚎紼嬬殑鏂瑰紡鏉ョ鐞嗚繛鎺ワ紝涓葷嚎紼嬭礋璐f帴鏀惰繛鎺?/font>錛屽湪鎺ュ埌榪炴帴鍚庡彉鍒涘緩鏂扮殑綰跨▼錛屾瘡涓嚎紼嬭礋璐d笌鑷繁鐨勫鎴風榪涜閫氫俊銆?/p>
聽2聽import聽java.io.IOException;
聽3聽import聽java.io.InputStreamReader;
聽4聽import聽java.io.PrintWriter;
聽5聽import聽java.net.ServerSocket;
聽6聽import聽java.net.Socket;
聽7聽import聽java.util.concurrent.ExecutorService;
聽8聽import聽java.util.concurrent.Executors;
聽9聽
10聽public聽class聽SocketThreadPoolDemoServer聽{
11聽
12聽聽聽聽聽private聽int聽port聽=聽8000;
13聽
14聽聽聽聽聽private聽ServerSocket聽serverSocket;
15聽
16聽聽聽聽聽private聽ExecutorService聽executorService;聽//聽榪炴帴姹?/span>
17聽
18聽聽聽聽聽private聽final聽int聽POOL_SIZE聽=聽1;聽//聽榪炴帴姹犲ぇ灝徛?聽鑻ヤ負聽1聽鏃舵渶澶氭敮鎸伮?聽綰跨▼
19聽
20聽聽聽聽聽public聽SocketThreadPoolDemoServer()聽throws聽Exception聽{
21聽聽聽聽聽聽聽聽聽serverSocket聽=聽new聽ServerSocket(port);
22聽聽聽聽聽聽聽聽聽executorService聽=聽Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()聽*聽POOL_SIZE);//聽鍒濆鍖栫嚎紼嬫睜
23聽聽聽聽聽聽聽聽聽System.out.println("waitting聽connet");
24聽
25聽聽聽聽聽}
26聽
27聽聽聽聽聽/**
28聽聽聽聽聽聽*
29聽聽聽聽聽聽*聽鎺ュ彈榪炴帴
30聽聽聽聽聽聽*
31聽聽聽聽聽聽*聽@author聽sunjie聽at聽2016騫?鏈?4鏃?br />32聽聽聽聽聽聽*
33聽聽聽聽聽聽*/
34聽聽聽聽聽public聽void聽service()聽{
35聽聽聽聽聽聽聽聽聽Socket聽socket聽=聽null;
36聽聽聽聽聽聽聽聽聽while聽(true)聽{
37聽聽聽聽聽聽聽聽聽聽聽聽聽try聽{
38聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽socket聽=聽serverSocket.accept();
39聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽executorService.execute(new聽Handler(socket));聽//聽浣跨敤榪炴帴姹?br />40聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽//聽new聽Thread(new聽Handler(socket)).start();//聽涓嶄嬌鐢ㄨ繛鎺ユ睜
41聽聽聽聽聽聽聽聽聽聽聽聽聽}聽catch聽(IOException聽e)聽{
42聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽e.printStackTrace();
43聽聽聽聽聽聽聽聽聽聽聽聽聽}
44聽聽聽聽聽聽聽聽聽}
45聽聽聽聽聽}
46聽
47聽聽聽聽聽/**
48聽聽聽聽聽聽*
49聽聽聽聽聽聽*聽綰跨▼綾伙紝璐熻矗緇存寔涓庝竴涓鎴風鐨勯氫俊
50聽聽聽聽聽聽*
51聽聽聽聽聽聽*聽@author聽sunjie聽at聽2016騫?鏈?4鏃?br />52聽聽聽聽聽聽*
53聽聽聽聽聽聽*/
54聽聽聽聽聽class聽Handler聽implements聽Runnable聽{
55聽
56聽聽聽聽聽聽聽聽聽private聽Socket聽socket聽=聽null;
57聽
58聽聽聽聽聽聽聽聽聽public聽Handler(Socket聽socket)聽{
59聽聽聽聽聽聽聽聽聽聽聽聽聽this.socket聽=聽socket;
60聽聽聽聽聽聽聽聽聽}
61聽
62聽聽聽聽聽聽聽聽聽@Override
63聽聽聽聽聽聽聽聽聽public聽void聽run()聽{
64聽聽聽聽聽聽聽聽聽聽聽聽聽System.out.println("new聽connection聽accepted:"聽+聽socket.getInetAddress()聽+聽":"聽+聽socket.getPort());
65聽聽聽聽聽聽聽聽聽聽聽聽聽try聽{
66聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽BufferedReader聽reader聽=聽new聽BufferedReader(new聽InputStreamReader(socket.getInputStream(),聽"UTF-8"));
67聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽PrintWriter聽writer聽=聽new聽PrintWriter(socket.getOutputStream());
68聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽String聽msg聽=聽null;
69聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽while聽((msg聽=聽reader.readLine())聽!=聽null)聽{
70聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽System.out.println("from聽"聽+聽socket.getInetAddress()聽+聽":"聽+聽socket.getPort()聽+聽",聽receive聽msg:"
71聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽+聽msg);
72聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽writer.println(msg);
73聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽writer.flush();
74聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽if聽("close".equals(msg))聽{
75聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽break;
76聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽}
77聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽}
78聽聽聽聽聽聽聽聽聽聽聽聽聽}聽catch聽(IOException聽e)聽{
79聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽e.printStackTrace();
80聽聽聽聽聽聽聽聽聽聽聽聽聽}聽finally聽{
81聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽try聽{
82聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽if聽(socket聽!=聽null)聽{
83聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽socket.close();
84聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽}
85聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽}聽catch聽(IOException聽e)聽{
86聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽e.printStackTrace();
87聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽}
88聽聽聽聽聽聽聽聽聽聽聽聽聽}
89聽聽聽聽聽聽聽聽聽}
90聽聽聽聽聽}
91聽
92聽聽聽聽聽public聽static聽void聽main(String[]聽args)聽throws聽Exception聽{
93聽聽聽聽聽聽聽聽聽new聽SocketThreadPoolDemoServer().service();
94聽聽聽聽聽}
95聽}
96聽
97聽
聽2聽
聽3聽聽聽聽聽private聽String聽host聽=聽"127.0.0.1";//聽瑕佸彂閫佺粰鏈嶅姟绔殑ip
聽4聽
聽5聽聽聽聽聽private聽int聽port聽=聽8000;//聽瑕佸彂閫佺粰鏈嶅姟绔殑绔彛
聽6聽
聽7聽聽聽聽聽private聽Socket聽socket;
聽8聽
聽9聽聽聽聽聽public聽SocketDemoClient()聽throws聽Exception聽{
10聽聽聽聽聽聽聽聽聽socket聽=聽new聽Socket(host,聽port);//聽鏋勯燬ocket瀹㈡埛绔紝騫朵笌榪炴帴鏈嶅姟绔?/span>
11聽聽聽聽聽}
12聽
13聽聽聽聽聽public聽void聽talk()聽throws聽IOException聽{
14聽聽聽聽聽聽聽聽聽try聽{
15聽聽聽聽聽聽聽聽聽聽聽聽聽BufferedReader聽reader聽=聽new聽BufferedReader(new聽InputStreamReader(socket.getInputStream(),聽"UTF-8"));
16聽聽聽聽聽聽聽聽聽聽聽聽聽PrintWriter聽writer聽=聽new聽PrintWriter(socket.getOutputStream());
17聽聽聽聽聽聽聽聽聽聽聽聽聽//聽璇誨彇鏈湴鎺у埗鍙扮殑娑堟伅
18聽聽聽聽聽聽聽聽聽聽聽聽聽BufferedReader聽localReader聽=聽new聽BufferedReader(new聽InputStreamReader(System.in));
19聽聽聽聽聽聽聽聽聽聽聽聽聽String聽msg聽=聽null;
20聽聽聽聽聽聽聽聽聽聽聽聽聽while聽((msg聽=聽localReader.readLine())聽!=聽null)聽{
21聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽writer.println(msg);
22聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽writer.flush();
23聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽System.out.println("send聽msg:"聽+聽reader.readLine());
24聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽if聽("close".equals(msg))聽{
25聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽break;
26聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽}
27聽聽聽聽聽聽聽聽聽聽聽聽聽}
28聽聽聽聽聽聽聽聽聽}聽catch聽(Exception聽e)聽{
29聽聽聽聽聽聽聽聽聽聽聽聽聽e.printStackTrace();
30聽聽聽聽聽聽聽聽聽}聽finally聽{
31聽聽聽聽聽聽聽聽聽聽聽聽聽if聽(socket聽!=聽null)聽{
32聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽socket.close();
33聽聽聽聽聽聽聽聽聽聽聽聽聽}
34聽聽聽聽聽聽聽聽聽}
35聽聽聽聽聽}
36聽
37聽聽聽聽聽public聽static聽void聽main(String[]聽args)聽throws聽Exception聽{
38聽聽聽聽聽聽聽聽聽new聽SocketDemoClient().talk();
39聽聽聽聽聽}
40聽}
waitting connet鈥?
new connection accepted:/127.0.0.1:59593
new connection accepted:/127.0.0.1:59596
鎴戜滑鍦ㄥ幓瀹㈡埛绔?鐨凜onsole涓緭鍏ユ垜浠鍙戦佺殑娑堟伅鈥濈淮鎶や笘鐣屽拰騫斥濓紝鍥炶濺紜畾鍚庯紝瀹㈡埛绔?鐨凜onsole鍑虹幇浠ヤ笅緇撴灉錛屾秷鎭凡緇忓彂鍑猴細
send msg:緇存姢涓栫晫鍜屽鉤
鍐嶅幓瀹㈡埛绔?鐨凜onsole涓緭鍏モ濆ソ濂藉涔犲ぉ澶╁悜涓娾濓紝鍥炶濺紜畾鍚庯紝瀹㈡埛绔?鐨凜onsole鍑虹幇浠ヤ笅緇撴灉錛屾秷鎭凡緇忓彂鍑猴細
send msg:濂藉ソ瀛︿範澶╁ぉ鍚戜笂
鍦ㄦ湇鍔$鐨凜onsole涓紝鎴戜滑浼氱湅鍒板涓嬬粨鏋滐紝璇存槑涓や釜瀹㈡埛绔殑娑堟伅宸茬粡琚帴鍙?/font>錛?/p> waitting connet鈥?
new connection accepted:/127.0.0.1:59593
new connection accepted:/127.0.0.1:59596
from /127.0.0.1:59593, receive msg:緇存姢涓栫晫鍜屽鉤
from /127.0.0.1:59596, receive msg:濂藉ソ瀛︿範澶╁ぉ鍚戜笂
]]>