21 涓栫邯鍒濓紝Spring 妗嗘灦鐨勮癁鐢熷拰宕涜搗璁╂矇閲嶈岃厫鏈界殑 J2EE 閬埌浜嗗綋澶存鍠濓紝闅忓悗澶ф壒寮鍙戜漢鍛樿漿鎶?Spring 闃佃惀錛屽懠鍚擱棿灝辮 J2EE 闃佃惀澶т激鍏冩皵銆傜劧鑰岃繖縐嶅懡鎮竴綰跨殑鍗辨満騫舵病鏈夐犳垚姣佺伃鎬х殑鎵撳嚮錛屽挨鍏舵槸瀵逛簬 Java 榪欑鎻愬″紑鏀劇殑騫沖彴鑰岃█錛屽彇闀胯ˉ鐭紝浜掔浉淇冭繘鎵嶆槸姝i亾銆備簬鏄紝JCP 濮斿憳浼氱棝瀹氭濈棝錛屽湪 2006 騫存帹鍑?Java EE 5 瑙勮寖錛屼富瑕佹槸瀵?EJB 鐨勫紑鍙戣繘琛屼簡鏋佸ぇ騫呭害鐨勭畝鍖栥?008 騫村彂甯冪殑 Java EE 6 寮曞叆浜?CDI銆丅V銆丣AX-RS 絳変竴緋誨垪鏂板姛鑳斤紝騫朵笖浠ラ厤緗枃浠訛紙profile錛夌殑鏂瑰紡璁?Java EE 鍚戣交閲忕駭榪堣繘浜嗕竴姝ャ傜壒鍒湁瓚g殑鏄紝Spring 妗嗘灦涔熷紑濮嬫彁渚涘鏌愪簺 Java EE 娉ㄨВ鐨勬敮鎸侊紝鏄惁鏍囧織鐫涓ゅぇ闃佃惀寮濮嬪悎嫻侊紵Java EE 7 棰勫畾浜庝粖騫翠笅鍗婂勾鍙戝竷錛岀洰鏍囨槸鏀寔浜戣綆椼傛渶榪戝嚑騫存潵錛屼簯璁$畻涓鐩磋鐐掍綔錛屽嵈浠庢潵娌℃湁涓涓噯紜殑瀹氫箟鍜岃鑼冿紝甯屾湜 Java EE 7 鑳藉鍦?Java 鐣屾壄杞繖縐嶅按灝殑灞闈€?/p>
涓嬮潰寮濮嬭緇嗗垪涓?Java EE 7 鐨勬柊鍔熻兘鍓嶇灮錛屾暟鎹潵婧愪簬銆奐ava Magazine 2012-01/02銆嬩腑鐨勩奀loud/Java EE: Looking Ahead to Java EE 7銆嬩竴鏂囥侸ava EE 7 鏄互鈥滄棩鏈熼┍鍔ㄢ濈殑鏂瑰紡寮鍙戠殑錛屼篃灝辨槸璇達紝鍦ㄨ鍒掓棩鏈熷埌杈懼墠娌℃湁瀹屾垚鐨勫姛鑳介兘灝嗚鎺ㄨ繜鍒?Java EE 8銆?/p>
@Inject
鏇寸揣瀵嗛泦鎴愩?/li>
ELContext
鍒嗙涓鴻В鏋愬拰姹傚間笂涓嬫枃銆?/li>
cc:interface
鍙夛紝Facelet 鏍囪搴撶殑閫熻 URL錛屼笌 CDI 闆嗘垚錛孞SF 緇勪歡鐨?OSGi 鏀寔銆?/li>
fileUpload
鍜?BackButton
絳夋柊緇勪歡銆?/li>
ForkJoinPool
鏄?Java SE 7 鏂板姛鑳解滃垎鍙?緇撳悎妗嗘灦鈥濈殑鏍稿績綾伙紝鐜板湪鍙兘涔忎漢闂觸錛屼絾鎴戣寰楀畠榪熸棭浼氭垚涓轟富嫻併傚垎鍙?緇撳悎妗嗘灦鏄竴涓瘮杈冪壒孌婄殑綰跨▼姹犳鏋訛紝涓撶敤浜庨渶瑕佸皢涓涓換鍔′笉鏂垎瑙f垚瀛愪換鍔★紙鍒嗗弶錛夛紝鍐嶄笉鏂繘琛屾眹鎬誨緱鍒版渶緇堢粨鏋滐紙緇撳悎錛夌殑璁$畻榪囩▼銆傛瘮璧蜂紶緇熺殑綰跨▼姹犵被 ThreadPoolExecutor
錛?code>ForkJoinPool 瀹炵幇浜嗗伐浣滅獌鍙栫畻娉曪紝浣垮緱絀洪棽綰跨▼鑳藉涓誨姩鍒嗘媴浠庡埆鐨勭嚎紼嬪垎瑙e嚭鏉ョ殑瀛愪換鍔★紝浠庤岃鎵鏈夌殑綰跨▼閮藉敖鍙兘澶勪簬楗辨弧鐨勫伐浣滅姸鎬侊紝鎻愰珮鎵ц鏁堢巼銆?/p>
ForkJoinPool
鎻愪緵浜嗕笁綾繪柟娉曟潵璋冨害瀛愪換鍔★細
execute
緋誨垪invoke
鍜?invokeAll
submit
緋誨垪Future
瀵硅薄銆?/dd>
瀛愪換鍔$敱 ForkJoinTask
鐨勫疄渚嬫潵浠h〃銆傚畠鏄竴涓娊璞$被錛孞DK 涓烘垜浠彁渚涗簡涓や釜瀹炵幇錛?code>RecursiveTask 鍜?RecursiveAction
錛屽垎鍒敤浜庨渶瑕佸拰涓嶉渶瑕佽繑鍥炶綆楃粨鏋滅殑瀛愪換鍔°?code>ForkJoinTask 鎻愪緵浜嗕笁涓潤鎬佺殑 invokeAll
鏂規硶鏉ヨ皟搴﹀瓙浠誨姟錛屾敞鎰忓彧鑳藉湪 ForkJoinPool
鎵ц璁$畻鐨勮繃紼嬩腑璋冪敤瀹冧滑銆?/p>
ForkJoinPool
鍜?ForkJoinTask
榪樻彁渚涗簡寰堝璁╀漢鐪艱姳緙貢鐨勫叕鍏辨柟娉曪紝鍏跺疄瀹冧滑澶у鏁伴兘鏄叾鍐呴儴瀹炵幇鍘昏皟鐢ㄧ殑錛屽浜庡簲鐢ㄥ紑鍙戜漢鍛樻潵璇存剰涔変笉澶с?/p>
涓嬮潰浠ョ粺璁?D 鐩樻枃浠朵釜鏁頒負渚嬨傝繖瀹為檯涓婃槸瀵逛竴涓枃浠舵爲鐨勯亶鍘嗭紝鎴戜滑闇瑕侀掑綊鍦扮粺璁℃瘡涓洰褰曚笅鐨勬枃浠舵暟閲忥紝鏈鍚庢眹鎬伙紝闈炲父閫傚悎鐢ㄥ垎鍙?緇撳悎妗嗘灦鏉ュ鐞嗭細
// 澶勭悊鍗曚釜鐩綍鐨勪換鍔? public class CountingTask extends RecursiveTask<Integer> { private Path dir; public CountingTask(Path dir) { this.dir = dir; } @Override protected Integer compute() { int count = 0; List<CountingTask> subTasks = new ArrayList<>(); // 璇誨彇鐩綍 dir 鐨勫瓙璺緞銆? try (DirectoryStream<Path> ds = Files.newDirectoryStream(dir)) { for (Path subPath : ds) { if (Files.isDirectory(subPath, LinkOption.NOFOLLOW_LINKS)) { // 瀵規瘡涓瓙鐩綍閮芥柊寤轟竴涓瓙浠誨姟銆? subTasks.add(new CountingTask(subPath)); } else { // 閬囧埌鏂囦歡錛屽垯璁℃暟鍣ㄥ鍔?1銆? count++; } } if (!subTasks.isEmpty()) { // 鍦ㄥ綋鍓嶇殑 ForkJoinPool 涓婅皟搴︽墍鏈夌殑瀛愪換鍔°? for (CountingTask subTask : invokeAll(subTasks)) { count += subTask.join(); } } } catch (IOException ex) { return 0; } return count; } } // 鐢ㄤ竴涓?ForkJoinPool 瀹炰緥璋冨害鈥滄諱換鍔♀濓紝鐒跺悗鏁鏈熷緟緇撴灉鈥︹? Integer count = new ForkJoinPool().invoke(new CountingTask(Paths.get("D:/")));
鍦ㄦ垜鐨勭瑪璁版湰涓婏紝緇忓嬈¤繍琛岃繖孌典唬鐮侊紝鑰楄垂鐨勬椂闂寸ǔ瀹氬湪 600 璞宸﹀彸銆傛櫘閫氱嚎紼嬫睜錛?code>Executors.newCachedThreadPool()錛夎楁椂 1100 姣宸﹀彸錛岃凍瑙佸伐浣滅獌鍙栫殑浼樺娍銆?/p>
緇撴潫鏈枃鍓嶏紝鎴戜滑鏉ュ洿瑙備竴涓渶紲炲鐨勭粨鏋滐細鍗曠嚎紼嬬畻娉曪紙浣跨敤 Files.walkFileTree(...)
錛夋瘮榪欎袱涓兘蹇紝騫沖潎鑰楁椂 550 姣錛佽繖璀﹀憡鎴戜滑騫墮潪寮曞叆澶氱嚎紼嬪氨鑳戒紭鍖栨ц兘錛屽茍欏昏鍏堢粡榪囧嬈℃祴璇曟墠鑳戒笅緇撹銆?/p>
鍓嶉潰宸茬粡鐪嬪埌錛?code>Socket 綾葷殑 getInputStream()
鍜?getOutStream()
鏂規硶鍒嗗埆鑾峰彇濂楁帴瀛楃殑杈撳叆嫻佸拰杈撳嚭嫻併傝緭鍏ユ祦鐢ㄦ潵璇誨彇榪滅鍙戦佽繃鏉ョ殑鏁版嵁錛岃緭鍑烘祦鍒欑敤鏉ュ悜榪滅鍙戦佹暟鎹?/p>
浣跨敤濂楁帴瀛楃殑杈撳叆嫻佽鍙栨暟鎹椂錛屽綋鍓嶇嚎紼嬩細榪涘叆闃誨鐘舵侊紝鐩村埌濂楁帴瀛楁敹鍒頒竴浜涙暟鎹負姝紙浜﹀嵆濂楁帴瀛楃殑鎺ユ敹緙撳啿鍖烘湁鍙敤鏁版嵁錛夈傝杈撳叆嫻佺殑 available()
鏂規硶鍙槸榪斿洖鎺ユ敹緙撳啿鍖虹殑鍙敤瀛楄妭鏁伴噺錛屼笉鍙兘鐭ラ亾榪滅榪樿鍙戦佸灝戝瓧鑺傘備嬌鐢ㄨ緭鍏ユ祦鐨勬椂鍊欙紝鏈濂藉厛灝嗗畠鍖呰涓轟竴涓?BufferedInputStream
錛屽洜涓鴻鍙栨帴鏀剁紦鍐插尯灝嗗鑷?JVM 鍜屽簳灞傜郴緇熶箣闂寸殑鍒囨崲錛屽簲褰撳敖閲忓噺灝戝垏鎹㈡鏁頒互鎻愰珮鎬ц兘銆?code>BufferedInputStream 鐨勭紦鍐插尯澶у皬鏈濂借涓哄鎺ュ瓧鎺ユ敹緙撳啿鍖虹殑澶у皬銆?/p>
濡傛灉鐩存帴璋冪敤杈撳叆嫻佺殑 close()
鏂規硶鏉ュ叧闂畠錛屽垯灝嗗鑷村鎺ュ瓧琚叧闂傚姝わ紝Socket
綾繪彁渚涗簡涓涓?shutdownInput()
鏂規硶鏉ョ鐢ㄨ緭鍏ユ祦銆傝皟鐢ㄨ鏂規硶鍚庯紝姣忔璇繪搷浣滈兘灝嗚繑鍥?EOF
錛屾棤娉曞啀璇誨彇榪滅鍙戦佺殑鏁版嵁銆傚榪欎釜 EOF
鐨勬嫻嬶紝涓嶅悓鐨勮緭鍏ユ祦鍖呰浣撶幇鍑轟笉鍚岀殑緇撴灉錛屽彲鑳借鍒?-1 涓瓧鑺傦紝鍙兘璇誨埌鐨勫瓧絎︿覆涓?null
錛岃繕鍙兘鏀跺埌涓涓?EOFException
絳夌瓑銆傜鐢ㄨ緭鍏ユ祦鍚庯紝榪滅杈撳嚭嫻佺殑琛屼負鏄鉤鍙扮浉鍏崇殑錛?/p>
紱佺敤杈撳叆嫻佽繖縐嶆妧鏈茍涓嶅父鐢ㄣ?/p>
濂楁帴瀛楃殑杈撳嚭鎿嶄綔瀹為檯涓婁粎浠呭皢鏁版嵁鍐欏埌鍙戦佺紦鍐插尯鍐咃紝褰撳彂閫佺紦鍐插尯濉弧涓斾笂嬈$殑鍙戦佹垚鍔熷悗錛岀敱搴曞眰緋葷粺璐熻矗鍙戦併傚鏋滃彂閫佺紦鍐插尯鐨勫墿浣欑┖闂翠笉澶燂紝褰撳墠綰跨▼灝變細闃誨銆傚拰杈撳叆嫻佺被浼鹼紝鏈濂藉皢杈撳嚭嫻佸寘瑁呬負 BufferedOutputStream
銆?/p>
濡傛灉濂楁帴瀛楃殑鍙屽彂閮戒嬌鐢?ObjectInputStream
鍜?ObjectOutputStream
鏉ヨ鍐?Java 瀵硅薄錛屽垯蹇呴』鍏堝垱寤?ObjectOutputStream
錛屽洜涓?ObjectInputStream
鍦ㄦ瀯閫犵殑鏃跺欎細璇曞浘璇誨彇瀵硅薄澶撮儴錛屽鏋滃弻鍙戦兘鍏堝垱寤?ObjectInputStream
錛屽垯浼氫簰鐩哥瓑寰呭鏂圭殑杈撳嚭錛岄犳垚姝婚攣錛?/p>
// 鍒涘緩鐨勯『搴忎笉鑳介鍊掞紒 ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
綾諱技浜庤緭鍏ユ祦錛屽叧闂緭鍑烘祦涔熷鑷村叧闂鎺ュ瓧錛屾墍浠?Socket
綾誨悓鏍鋒彁渚涗簡涓涓?shutdownOutput()
鏉ョ鐢ㄨ緭鍑烘祦銆傜鐢ㄨ緭鍑烘祦鍚庯紝宸插啓鍏ュ彂閫佺紦鍐插尯鐨勬暟鎹細姝e父鍙戦侊紝涔嬪悗鐨勪換浣曞啓鎿嶄綔閮戒細瀵艱嚧 IOException
錛屼笖榪滅鐨勮緭鍏ユ祦濮嬬粓浼氳鍒?EOF
銆傜鐢ㄨ緭鍑烘祦闈炲父鏈夌敤錛屼緥濡傚鎺ュ瓧鐨勫弻鍙戦兘鍦ㄥ彂閫佸畬姣曟暟鎹悗紱佺敤杈撳叆嫻侊紝鐒跺悗鍙屾柟閮戒細鏀跺埌 EOF
錛屼粠鑰岀煡閬撴暟鎹凡緇忓叏閮ㄤ氦鎹㈠畬姣曪紝鍙互瀹夊叏鍏抽棴濂楁帴瀛椼傜洿鎺ュ叧闂鎺ュ瓧浼氬悓鏃跺叧闂緭鍏ユ祦鍜岃緭鍑烘祦錛屼笖鏂紑榪炴帴錛岃揪涓嶅埌榪欑鏁堟灉銆?/p>
濡傛灉瑕佷嬌鐢ㄦ祦榪涜杈撳叆鍜岃緭鍑猴紝灝卞彧鑳界敤闃誨妯″紡鐨勫鎺ュ瓧銆傝繖閲屾葷粨涓涓嬮樆濉炲鎺ュ瓧鐨勪紭緙虹偣銆傚厛鐪嬬湅浼樼偣錛?/p>
浣嗗湪鎬ц兘鏂歸潰鏈夎嚧鍛界殑緙虹偣錛?/p>
涓嬩竴綃囨枃绔犲紑濮嬫帰璁ㄤ嬌鐢ㄥ熀浜?NIO 鐨勫鎺ュ瓧閫氶亾鍜岀紦鍐插尯瀹炵幇浼哥緝鎬ф洿寮虹殑 TCP 濂楁帴瀛椼?/p>
ServerSocket
綾誨拰 Socket
綾婚兘鎻愪緵浜嗗涓叕鍏辨瀯閫犳柟娉曘備笉鍚岀殑鏋勯犳柟娉曚笉浠呭甫鐨勫弬鏁頒笉鍚岋紝鎵鍏鋒湁鐨勬剰涔変篃涓嶄竴鏍楓備笅闈㈠垎鍒В鏋愯繖涓や釜綾葷殑瀹炰緥鍒濆鍖栬繃紼嬨?/p>
ServerSocket
瀹炰緥鐨勫垵濮嬪寲ServerSocket
綾繪彁渚涗簡鍥涗釜鏋勯犲櫒錛?/p>
public ServerSocket(int port) throws IOException
public ServerSocket(int port, int backlog) throws IOException
public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException
public ServerSocket() throws IOException
甯﹀弬鏋勯犲櫒鐢ㄦ潵鍒涘緩宸茬粦瀹氱殑鏈嶅姟鍣ㄥ鎺ュ瓧錛屼篃灝辨槸璇存瀯閫犳垚鍔熷悗瀹冨氨宸茬粡寮濮嬩睛鍚寚瀹氱殑绔彛錛屼笖鑳藉璋冪敤 accept()
鏂規硶鏉ユ帴鍙楀鎴風榪炴帴銆傞粯璁ゆ瀯閫犲櫒鍒欎細鍒涘緩鏈粦瀹氱殑鏈嶅姟鍣ㄥ鎺ュ瓧錛屾瀯閫犳垚鍔熷悗蹇呴』鎵嬪姩灝嗗叾緇戝畾鍒頒竴涓湰鍦板湴鍧鎵嶈兘鐢紝鍦ㄧ粦瀹氫箣鍓嶅彲浠ヨ繘琛屼竴浜涢夐」閰嶇疆銆?/p>
鎬葷殑鏉ヨ錛屽甫鍙傛瀯閫犲櫒鎻愪緵浜嗕笁涓弬鏁幫細
port
backlog
accept()
鏂規硶錛夛紝瀹冨氨浼氳浠庨槦鍒椾腑縐婚櫎銆?code>backlog 鍙傛暟灝辯敤浜庢寚瀹氶槦鍒楃殑鏈澶ч暱搴︼紝榛樿鍊間負 50錛屼絾榪欎釜鍊煎彧鏄竴涓緩璁紝搴曞眰緋葷粺鍙兘鏍規嵁闇瑕佽嚜鍔ㄨ皟鏁淬傚鏋滈槦鍒楁弧浜嗭紝鍒欏叾琛屼負鏄鉤鍙扮浉鍏崇殑錛氬井杞殑 WINSOCK 浼氭嫆緇濇柊鐨勮繛鎺ワ紝鍏朵粬瀹炵幇鍒欎粈涔堥兘涓嶅仛銆備弗鏍煎湴璇達紝寰蔣娌℃湁閬靛畧瑙勮寖錛岀牬鍧忎簡娓告垙瑙勫垯鈥︹?/dd>
bindAddr
null
錛屾湇鍔″櫒濂楁帴瀛椾細鍦ㄦ墍鏈夌殑鏈湴 IP 鍦板潃錛?code>0.0.0.0 鎴?::0
錛変笂渚﹀惉銆傚鏋滃笇鏈涘彧渚﹀惉涓涓湴鍧錛屽垯鍙嬌鐢ㄨ鍙傛暟銆?/dd>
濡傛灉浣跨敤榛樿鏋勯犲櫒錛屽湪緇戝畾鍦板潃鍓嶏紝榪樺彲浠ュ仛浜涢厤緗傜粦瀹氭搷浣滅敱涓や釜 bind
鏂規硶瀹氫箟錛屽弬鏁扮被浼間簬甯﹀弬鏋勯犲櫒銆傞厤緗」鍖呮嫭浠ヤ笅鏂歸潰錛堥兘蹇呴』鍦ㄧ粦瀹氬墠閰嶇疆錛夛細
setReuseAddress(boolean on)
鏂規硶閰嶇疆錛屽搴斿簳灞傜郴緇熺殑 SO_REUSEADDR
濂楁帴瀛楅夐」銆侸DK 娌℃湁瀹氫箟璇ラ夐」鐨勯粯璁ゅ箋傚鏋滆閫夐」涓?false
錛屽垯鍦ㄥ叧闂?TCP 榪炴帴鏃訛紝涓轟簡淇濊瘉鍙潬鎬э紝璇ヨ繛鎺ュ彲鑳藉湪鍏抽棴鍚庣殑涓孌墊椂闂達紙澶х害涓ゅ垎閽燂級鍐呬繚鎸佽秴鏃剁姸鎬侊紙閫氬父縐頒負 TIME_WAIT
鐘舵佹垨 2MSL
絳夊緟鐘舵侊級錛岃繖孌墊椂闂撮噷鏃犳硶灝嗘柊寤虹殑鏈嶅姟鍣ㄥ鎺ュ瓧緇戝畾鍒板悓涓涓湴鍧銆傚湪寮鍙戦樁孌碉紝鏈嶅姟鍣ㄥ彲鑳戒笉鏂噸鍚紝鎵撳紑鏀歸夐」浼氶潪甯告湁鐢ㄣ?/dd>
setReceiveBufferSize(int size)
鏂規硶閰嶇疆錛屽搴斿簳灞傜郴緇熺殑 SO_RCVBUF
濂楁帴瀛楅夐」錛屽崟浣嶆槸瀛楄妭銆傘奟FC 1323 - TCP Extensions for High Performance銆嬪皢緙撳啿鍖哄ぇ灝忓畾涔変負 64KB銆傝閫夐」鍙槸涓涓緩璁鹼紝搴曞眰緋葷粺鍙兘鏍規嵁闇瑕佽嚜琛岃皟鏁淬?/dd>
setSoTimeout(int timeout)
鏂規硶閰嶇疆錛屽搴斿簳灞傜郴緇熺殑 SO_TIMEOUT
濂楁帴瀛楅夐」錛屽崟浣嶆槸姣銆傞粯璁ゅ間負 0銆傝閫夐」褰卞搷 accept
鏂規硶鐨勯樆濉炴椂闂撮暱搴︼紝濡傛灉瓚呮椂灝嗗紩鍙?SocketTimeoutException
銆傚鏋滆涓?0錛屽垯琛ㄧず姘鎬笉瓚呮椂銆?/dd>
setPerformancePreferences(int connectionTime, int latency, int bandwidth)
鏂規硶閰嶇疆銆傝繖涓変釜鏁板煎垎鍒〃紺虹煭榪炴帴鏃墮棿銆佷綆寤惰繜鍜岄珮甯﹀鐨勭浉瀵歸噸瑕佹э紝鏁板艱秺澶у垯瓚婇噸瑕侊紱鍏跺悇鑷殑緇濆鍊兼病鏈夋剰涔夈傝鏂規硶鐨勫垵琛鋒槸涓轟簡璁?Java 鑳藉湪鐢ㄩ潪 TCP/IP 瀹炵幇鐨勫鎺ュ瓧鐜涓嬪伐浣滃緱鏇村ソ錛屾煇浜涢渶瑕佸緗戠粶榪涜璋冧紭鐨勭▼搴忎篃鍙互灝嗚繖涓変釜棣栭夐」浣滀負閰嶇疆鍙傛暟鎻愪緵緇欑敤鎴楓?/dd>
Socket
瀹炰緥鐨勫垵濮嬪寲Socket
綾繪彁渚涗簡鍏釜鍏叡鏋勯犲櫒錛堝凡榪囨椂鐨勯櫎澶栵級錛?/p>
public Socket(String host, int port) throws UnknownHostException, IOException
public Socket(InetAddress address, int port) throws IOException
public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException
public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException
public Socket()
public Socket(Proxy proxy)
鍓嶅洓涓瀯閫犲櫒鍒涘緩宸茶繛鎺ョ殑瀹㈡埛绔鎺ュ瓧錛屼篃灝辨槸璇存瀯閫犵殑鏃跺欏氨浼氬幓榪炴帴鏈嶅姟鍣ㄣ傚墠涓や釜鏋勯犲櫒闇瑕佹彁渚涙湇鍔″櫒鐨勫湴鍧鍜岀鍙d綔涓哄弬鏁幫紝鏈湴鍦板潃鍜岀鍙g敱緋葷粺鑷姩鍒嗛厤錛涘悗涓や釜鍏佽鎵嬪姩鎸囧畾鏈湴鍦板潃鍜岀鍙o紝浣嗘瀬灝戜嬌鐢ㄣ傚悗涓や釜鏋勯犲櫒鍒涘緩鏈繛鎺ョ殑濂楁帴瀛楋紝鍒涘緩鍚庨渶瑕佽皟鐢?connect
鏂規硶鎵嬪姩榪炴帴錛岃繛鎺ヤ箣鍓嶅彲浠ュ仛涓浜涢厤緗傛渶鍚庝竴涓瀯閫犲櫒鎺ュ彈涓涓唬琛ㄤ唬鐞嗘湇鍔″叾鐨?Proxy
瀵硅薄錛孞DK 鏀寔 HTTP 鍜?SOCKS錛圴4 鎴?V5錛変袱縐嶄唬鐞嗙被鍨嬨?/p>
鍦ㄨ繛鎺ュ墠錛屽鎴風濂楁帴瀛椾笉浠呭儚鏈嶅姟鍣ㄥ鎺ュ瓧閭f牱鍙互璁劇疆鏄惁閲嶇敤鏈湴鍦板潃銆佺紦鍐插尯澶у皬銆佽秴鏃跺煎拰鎬ц兘棣栭夐」錛岃繕鑳藉閰嶇疆浠ヤ笅鍚勯」錛堥兘蹇呴』鍦ㄨ繛鎺ュ墠閰嶇疆錛夛細
setKeepAlive(boolean on)
鏂規硶閰嶇疆錛屽搴斿簳灞傜郴緇熺殑 SO_KEEPALIVE
濂楁帴瀛楅夐」銆傞粯璁ゅ間負 false
銆傚鏋滄墦寮璇ラ夐」錛屽垯濂楁帴瀛椾細瀹氭湡鑷姩鍙戦佷繚鎸佹椿璺冪殑鎺㈡祴鎬ф秷鎭紝綾諱技浜庡績璺蟲嫻嬨傛牴鎹奟FC 1122 - Requirements for Internet Hosts銆嬬殑瑙勫畾錛屼繚鎸佹椿璺冩満鍒跺彧鏄?TCP 鐨勪竴涓彲閫夊姛鑳斤紝濡傛灉鏀寔鐨勮瘽錛岄粯璁ゅ繀欏諱負 false
錛岃屼笖榪欑鏈哄埗榛樿鍦ㄦ垚鍔熷緩绔嬭繛鎺ュ悗錛屼笖榪炵畫涓ゅ皬鏃舵病鏈夋暟鎹紶杈撶殑鎯呭喌涓嬫墠浼氳嬋媧匯備粠鍙︿竴鏂歸潰鏉ョ湅錛岄氳繃濂楁帴瀛楃殑 I/O 鎿嶄綔瀹屽叏鍙互鐭ラ亾榪炴帴鏄惁榪樻湁鏁堬紝鎵浠ヨ閫夐」鐨勫疄鐢ㄤ環鍊間笉澶с?/dd>
setOOBInline(boolean on)
鏂規硶閰嶇疆錛屽搴斿簳灞傜郴緇熺殑 SO_OOBINLINE
濂楁帴瀛楅夐」銆傞粯璁ゅ間負 off
銆傚甫澶栨暟鎹紙Out-of-band Data錛変篃鍙仛绱фユ暟鎹紝琛ㄧず鏁版嵁寰堥噸瑕侊紝闇瑕佷嬌鐢ㄤ笉鍚屼簬鍙戦佹櫘閫氭暟鎹殑涓涓笓鐢ㄩ氶亾鏉ュ彂閫併傛墦寮璇ラ夐」鍚庯紝灝卞彲浠ヨ皟鐢?sendUrgentData(int data)
鏂規硶鍙戦佷竴涓瓧鑺傜殑绱фユ暟鎹侸DK 瀵瑰甫澶栨暟鎹彧鎻愪緵浜嗘湁闄愭敮鎸侊紝绱фユ暟鎹皢浼氬拰鏅氭暟鎹竴璧瘋鏀跺埌錛屽茍涓旀棤娉曡嚜鍔ㄥ尯鍒嗐傝閫夐」瀵瑰簲鐢ㄥ紑鍙戜漢鍛樻剰涔変笉澶с?/dl>
setSoLinger(boolean on, int linger)
鏂規硶閰嶇疆錛屽搴斿簳灞傜郴緇熺殑 SO_LINGER
濂楁帴瀛楅夐」銆傞粯璁や負 false
銆傝閫夐」鍙細褰卞搷濂楁帴瀛楃殑鍏抽棴錛屽叾涓殑 linger
鍙傛暟琛ㄧず瓚呮椂鏃墮棿錛屽崟浣嶄負縐掋傚鏋滄墦寮鏀歸夐」錛氬鏋滃皢 linger
璁句負 0錛屽垯鍏抽棴濂楁帴瀛楃殑鏃跺欙紝鏈彂閫佺殑鏁版嵁浼氳涓㈠純錛屼笖鍙︿竴绔細鍑虹幇榪炴帴琚悓浣嶄綋閲嶇疆鐨勫紓甯革紱濡傛灉 linger
闈?0錛屽垯鍏抽棴濂楁帴瀛楃殑綰跨▼灝嗚闃誨錛岀洿鍒版暟鎹叏閮ㄥ彂閫佹垨瓚呮椂錛岃秴鏃跺悗鐨勮涓轟笌搴曞眰緋葷粺鐩稿叧錛孞DK 鏃犳硶鎺у埗銆傚鏋滃叧闂閫夐」錛屽垯濂楁帴瀛楁甯稿叧闂紝鏁版嵁涔熶細鍏ㄩ儴鍙戦併傜敱浜庡簳灞傚疄鐜扮殑宸紓鎬э紝涓嶆彁鍊″簲鐢ㄥ紑鍙戜漢鍛樻墦寮璇ラ夐」銆?/dd>
setTcpNoDelay(boolean on)
鏂規硶閰嶇疆錛屽搴斿簳灞傜郴緇熺殑 TCP_NODELAY
TCP 閫夐」銆傞粯璁ゅ間負 off
銆傛墦寮璇ラ夐」灝嗙鐢?Nagle 綆楁硶錛孴CP 鍖呬細绔嬪嵆鍙戦侊紱鍏抽棴璇ラ夐」鍒欎細鍚敤 Nagle 綆楁硶錛屽涓緝灝忕殑 TCP 鍖呬細琚粍鍚堟垚涓涓ぇ鍖呬竴璧峰彂閫侊紝铏界劧鍙戦佸歡榪熶簡錛屼絾鏈夊埄浜庨伩鍏嶇綉緇滄嫢濉炪傞粯璁や負 false
銆傝閫夐」瀵瑰疄鏃舵у緢寮虹殑紼嬪簭鍙兘鏈夌敤錛屼絾涓鑸殑紼嬪簭涓嶉渶瑕佸叧蹇冦?/dd>
setTrafficClass(int tc)
鏂規硶閰嶇疆錛屽搴斿簳灞傜郴緇熺殑鈥滄祦閲忕被鍒濆鎺ュ瓧灞炴с傝閫夐」鐢ㄤ簬鍚戠綉緇滐紙渚嬪璺敱鍣級鎻愮ず浠庤濂楁帴瀛楀彂閫佺殑鍖呴渶瑕佽幏鍙栧摢浜涙湇鍔$被鍨嬶紝瀵規湰鍦?TCP 鍗忚鏍堟病鏈夊獎鍝嶃侷Pv4 鍜?IPv6 鍒嗗埆瀹氫箟浜嗗涓笉鍚岀殑鍊鹼紝渚嬪 IPv4 灝?0x08
瀹氫箟涓烘渶澶у悶鍚愰噺錛?code>0x10 瀹氫箟涓烘渶灝忓歡榪燂紝絳夌瓑銆傚彲浠ョ敤鎴栬繍綆楀皢澶氫釜鍊煎悎騫朵負涓涓夐」銆傝閫夐」鐢ㄦ潵璋冩暣鎬ц兘錛岄渶瑕佹牴鎹疄闄呮儏鍐佃緗傜敱浜庡彧鏄緩璁鹼紝鍙兘琚綉緇滃拷鐣ャ?/dd>
緗戜笂寰堝鍏充簬鍗曚緥妯″紡鍐欐硶鐨勬枃绔狅紝涓嶅涔庨タ姹夊拰鎳掓眽涓ょ褰㈠紡鐨勮璁恒傚緢澶氫漢鍠滄鐢ㄦ噿姹夊紡錛屽洜涓鴻寰楀畠瀹炵幇浜嗗歡榪熷姞杞斤紝鍙互璁╃郴緇熺殑鎬ц兘鏇村ソ銆備絾浜嬪疄鏋滅湡濡傛鍚楋紵鎴戝姝ゅ瓨鐤戙?/p>
棣栧厛鎴戜滑媯鏌ヤ竴涓嬮タ姹夊拰鎳掓眽鍗曚緥妯″紡鏈綆鍗曠殑鍐欐硶錛堣繖閲屼笉璁ㄨ鍝鎳掓眽鍐欐硶鏇村ソ錛夛細
// 楗挎眽 public final class HungrySingleton { private static final HungrySingleton INSTANCE = new HungrySingleton(); private HungrySingleton() { System.out.println("Initializing..."); } public static HungrySingleton getInstance() { return INSTANCE; } } // 鎳掓眽 public final class LazySingleton { private static LazySingleton INSTANCE; private LazySingleton() { System.out.println("Initializing..."); } public static synchronized LazySingleton getInstance() { if (INSTANCE == null) { INSTANCE = new LazySingleton(); } return INSTANCE; } }
浠庣悊璁轟笂鏉ヨ錛?code>HungrySingleton 鐨勫崟渚嬪湪璇ョ被絎竴嬈′嬌鐢ㄧ殑鏃跺欏垱寤猴紝鑰?LazySingleton
鐨勫崟渚嬪垯鍦ㄥ叾 getInstance()
鏂規硶琚皟鐢ㄧ殑鏃跺欏垱寤恒傝嚦浜庣綉涓婃湁浜哄0縐扳滈タ姹夊紡涓嶇鐢ㄤ笉鐢ㄩ兘浼氬垵濮嬪寲鈥濓紝綰睘璧拌礬鐨勬椂鍊欐瀛愯繄寰楀お澶с傝皝鐨勫姞杞芥洿榪燂紵濡傛灉浣犲彧鏄皟鐢ㄥ畠浠殑 getInstance()
鏂規硶鏉ュ緱鍒板崟渚嬪璞★紝鍒欏畠浠兘鏄歡榪熷姞杞斤紝榪欐牱鎳掓眽寮忔病鏈変換浣曟剰涔夛紝鑰屼笖鐢變簬 LazySingleton
閲囧彇浜嗗悓姝ユ帾鏂斤紝鎬ц兘鏇翠綆錛堝彲浠ヨ浠諱綍鎳掓眽寮忕殑鎬ц兘閮戒綆浜庨タ姹夊紡錛夈傚綋浣犱嬌鐢ㄤ竴涓崟渚嬬被鐨勬椂鍊欙紝闅鵑亾絎竴姝ヤ笉鏄皟鐢?getInstance()
涔堬紵鎵浠ュ湪鑷繁鐨勪唬鐮侀噷錛屾垜鏇村枩嬈㈢敤楗挎眽寮忋?/p>
涓嬮潰鐢ㄤ竴涓緥瀛愭潵嫻嬭瘯鍔犺澆欏哄簭錛?/p>
// 楗挎眽 System.out.println("Before"); HungrySingleton.getInstance(); System.out.println("After"); // 鎳掓眽 System.out.println("Before"); LazySingleton.getInstance(); System.out.println("After");
杈撳嚭緇撴灉閮芥槸錛?/p>
Before Initializing... After
閭d箞錛屾噿姹夋ā寮忚繕鏈変粈涔堝瓨鍦ㄦ剰涔夛紵濡傛灉緋葷粺浣跨敤浜嗘煇浜涢渶瑕佸湪鍚姩鏃跺綾昏繘琛屾壂鎻忕殑妗嗘灦錛屼嬌鐢ㄩタ姹夊紡鐨勮瘽錛屽惎鍔ㄦ椂闂存瘮鎳掓眽寮忔洿闀匡紝濡傛灉浣跨敤浜嗗ぇ閲忓崟渚嬬被錛屼笉鍒╀簬寮鍙戦樁孌點傚湪緋葷粺鐨勬寮忚繍琛岄樁孌碉紝鎵鏈夌殑鍗曚緥綾昏繜鏃╅兘瑕佸姞杞界殑錛屾葷殑璇存潵涓よ呮ц兘鎸佸鉤錛屼絾鏄噿姹夊紡姣忔閮借嚦灝戝涓涓垽鏂紝鎵浠ヨ秺鍒板悗鏈熻秺浣撶幇楗挎眽鐨勪紭瓚婃с?/p>
鏈鍚庯紝鎺ㄨ崘涓嬨奅ffective Java銆嬬浜岀増鎸囧嚭鐨勭敤鏋氫婦綾誨瀷瀹炵幇鐨勯タ姹夊崟渚嬫ā寮忥細
// 楗挎眽 public enum HungrySingleton { INSTANCE; private HungrySingleton() { } }
榪欑鍐欐硶涓嶄絾鏈綆媧侊紝榪樿兘杞繪槗鎵╁睍涓哄疄渚嬫暟閲忓浐瀹氱殑鈥滃渚嬫ā寮忊濄?/p>