
嘻道奇闻
- 文章199742
- 阅读14625734
Java创建线程池的方法及代码示例解析
鍝庯紝浣犲啓鐨凧ava绋嬪簭鏄笉鏄€绘劅瑙夊崱鍗$殑锛熸瘡娆ew涓嚎绋嬪氨鐤媯鍚冨唴瀛橈紵浠婂ぉ鍜卞氨鍞犲敔杩欎釜鈥?strong>鈥嬬嚎绋嬫睜鈥?/strong>鈥嬶紝淇濆噯浣犲惉瀹岀洿鎷嶅ぇ鑵匡細"鏃╄鐢ㄨ繖鐜╂剰鍎夸簡锛?
涓€銆佺嚎绋嬫睜鏄釜鍟ワ紵涓哄暐瑕佺敤瀹冿紵
涓句釜鏍楀瓙馃尠锛氫綘寮€浜嗕竴瀹跺ザ鑼跺簵锛堢▼搴忥級锛岄【瀹紙浠诲姟锛夋潵浜嗗氨闆囦釜涓存椂宸ワ紙绾跨▼锛夛紝浜轰竴璧板氨杈為€€銆傜粨鏋滈珮宄版湡鏉ヤ簡100涓【瀹紝浣犲綋鍦虹牬浜р€斺€斺€?strong>鈥嬪唴瀛樼垎鐐糕€?/strong>鈥嬶紒
绾跨▼姹犲氨鍍忛泧浜?涓浐瀹氬憳宸ワ紝娲诲灏辨帓闃燂紝骞插畬鎺ョ潃鏈嶅姟涓嬩竴浣嶃€傗€?strong>鈥嬬渷浜嗘嫑浜哄紑閿€鈥?/strong>鈥嬶紙绾跨▼鍒涘缓閿€姣佹垚鏈級锛屸€?strong>鈥嬮伩鍏嶅簵閾哄€掗棴鈥?/strong>鈥嬶紙绯荤粺璧勬簮鑰楀敖锛夛紝浣犺棣欎笉棣欙紵
浜屻€佹墜鎶婃墜鏁欎綘涓ょ鍒涘缓鏂瑰紡
1. 鐢ㄧ幇鎴愮殑宸ュ叿绫伙紙Executors锛?/h4>
閫傚悎鍒氬叆闂ㄧ殑灏忕櫧锛屼唬鐮侀噺灏戝埌鍝細
java澶嶅埗// 濂惰尪搴楁爣閰?鍛樺伐锛屾渶澶?0浜猴紝澶氫綑璁㈠崟瀛橀槦鍒?/span> ExecutorService pool = Executors.newFixedThreadPool(5);
杩欒浠g爜鏆楄棌鐜勬満锛?/p>
- 鈥?strong>鈥媙ewFixedThreadPool鈥?/strong>鈥嬶細鍥哄畾浜烘暟锛岄€傚悎绋冲畾娴侀噺
- 鈥?strong>鈥媙ewCachedThreadPool鈥?/strong>鈥嬶細寮规€ф墿缂╁锛岄€傚悎绐佸彂娴侀噺
- 鈥?strong>鈥媙ewSingleThreadExecutor鈥?/strong>鈥嬶細鍗曠嚎绋嬶紝淇濊瘉椤哄簭鎵ц
浣嗘敞鎰忥紒杩欎簺鏂规硶搴曞眰閮界敤浜嗏€?strong>鈥婰inkedBlockingQueue鈥?/strong>鈥嬶紝闃熷垪鑳芥棤闄愬爢绉换鍔♀€斺€斿皬蹇冨唴瀛樻硠婕忚繖涓€佸叚锛?/p>
2. 鑷畾涔夐珮绾х帺瀹剁増锛圱hreadPoolExecutor锛?/h4>
鑰佸徃鏈洪兘鐖辫繖涔堢帺锛?涓弬鏁扮湅鐫€澶村ぇ锛熷叾瀹炶秴绠€鍗曪細
java澶嶅埗new ThreadPoolExecutor( 5, // 鏍稿績鍛樺伐5浜猴紙corePoolSize锛?/span> 10, // 蹇欎笉杩囨潵鏈€澶氶泧10浜猴紙maximumPoolSize锛?/span> 60L, // 闂叉椂60绉掓病娲诲共灏辫鍛橈紙keepAliveTime锛?/span> TimeUnit.SECONDS, // 鏃堕棿鍗曚綅 new ArrayBlockingQueue<>(100), // 鎺掗槦鍖烘渶澶?00鍗曪紙workQueue锛?/span> Executors.defaultThreadFactory(), // 鍛樺伐鍩硅鎵嬪唽锛坱hreadFactory锛?/span> new ThreadPoolExecutor.AbortPolicy() // 鐖嗗崟鏃剁洿鎺ユ嫆鎺ワ紙handler锛?/span> );
鍙傛暟瀵圭収琛紙寤鸿鏀惰棌锛夛細
鍙傛暟鍚?/th> | 浣滅敤 | 甯歌鍧戠偣 |
---|---|---|
corePoolSize | 姝e紡宸ユ暟閲?/td> | 鍒澶ぇ娴垂璧勬簮 |
maximumPoolSize | 涓存椂宸?姝e紡宸ヤ笂闄?/td> | 瓒呰繃CPU鏍告暟鍙嶈€屽彉鎱?/td> |
workQueue | 鍊欏鍖哄骇浣嶆暟 | 鐢ㄦ棤鐣岄槦鍒楀彲鑳藉唴瀛樼垎鐐?/td> |
handler | 鐖嗗崟鏃剁殑澶勭悊绛栫暐 | 閫夐敊绛栫暐浼氬鑷翠换鍔′涪澶?/td> |
涓夈€佷唬鐮佸疄鎴橈細濂惰尪搴楀彨鍙风郴缁?/h3>
鍋囪鍜变滑瑕佸鐞?0鏉鍗曪細
java澶嶅埗public class MilkTeaShop { public static void main(String[] args) { ExecutorService pool = new ThreadPoolExecutor( 3, 5, 30, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10) ); // 50涓【瀹㈡潵涓嬪崟 for (int i = 1; i <= 50; i++) { final int orderNum = i; pool.execute(() -> { System.out.println("姝e湪鍒朵綔绗? + orderNum + "鏉ザ鑼?.."); try { Thread.sleep(2000); // 妯℃嫙鍒朵綔鏃堕棿 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("鉁?绗? + orderNum + "鏉畬鎴愶紒"); }); } pool.shutdown(); // 鎵撶儕鏃跺埆蹇樹簡鍏冲簵锛?/span> } }
杩愯杩欐浠g爜浣犱細鍙戠幇锛?/p>
- 鍓?鏉洿鎺ュ紑鍋氾紙鏍稿績绾跨▼锛?/li>
- 绗?-13鏉湪鎺掗槦锛堥槦鍒楀閲?0锛?/li>
- 绗?4-50鏉洿鎺モ€?strong>鈥嬫嫆缁濇湇鍔♀€?/strong>鈥嬶紙鍥犱负maxPoolSize=5锛岄槦鍒?0锛屾€诲叡鍙兘澶勭悊15涓級
杩欐椂鍊欏氨闇€瑕佽皟鏁寸瓥鐣モ€斺€旀瘮濡傛敼鐢ㄢ€?strong>鈥婥allerRunsPolicy鈥?/strong>鈥嬶紝璁╄€佹澘浜茶嚜涓嬪満鍋氬ザ鑼讹紒
鍥涖€佷釜浜鸿俯鍧戠粡楠岃皥
- 鈥?strong>鈥嬬嚎绋嬫暟涓嶆槸瓒婂瓒婂ソ鈥?/strong>鈥嬶細CPU瀵嗛泦鍨嬩换鍔″缓璁涓烘牳蹇冩暟+1锛孖O瀵嗛泦鍨嬪彲浠?鍊嶆牳蹇冩暟
- 鈥?strong>鈥嬭鎯昈OM涓変欢濂椻€?/strong>鈥嬶細
- Executors.newFixedThreadPool锛堟棤鐣岄槦鍒楋級
- Executors.newCachedThreadPool锛堟棤鐣岀嚎绋嬫暟锛?/li>
- Executors.newSingleThreadExecutor锛堟棤鐣岄槦鍒楋級
- 鈥?strong>鈥嬬洃鎺х鍣ㄦ帹鑽愨€?/strong>鈥嬶細鐢↗MX鎴栬€匰pringBoot Actuator鏌ョ湅绾跨▼姹犵姸鎬侊紝姣旂畻鍛借繕鍑嗭紒
鍒氬叆琛岄偅浼氬効锛屾垜鍦ㄧ敓浜х幆澧冪敤newCachedThreadPool澶勭悊鍥剧墖涓婁紶锛岀粨鏋滃崐澶滄祦閲忔毚娑ㄧ洿鎺ユ悶鎸傛湇鍔″櫒鈥斺€旂幇鍦ㄦ兂鎯宠繕鑲濆効棰ゃ€傛墍浠ュ晩锛屸€?strong>鈥嬬嚎绋嬫睜鐢ㄥ緱濂斤紝涓嬬彮鍥炲鏃╋紱閰嶇疆涓嶄笂蹇冿紝鍔犵彮鍒板噷鏅ㄢ€?/strong>鈥嬨€?/p>
鏈€鍚庤鍙ユ帍蹇冪獫瀛愮殑锛氬埆瑙夊緱搴曞眰婧愮爜寰堥毦灏变笉鏁㈢銆傚綋鍒濇垜鐮旂┒ThreadPoolExecutor婧愮爜鏃讹紝鍙戠幇瀹冪殑璁捐灏卞儚涓櫤鑳借皟搴︿腑蹇冿紝鍚勭鎷掔粷绛栫暐鍏跺疄閮芥槸淇濇姢绯荤粺鐨勫畨鍏ㄩ榾銆傜幇鍦ㄦ柊寤虹嚎绋嬫睜鎴戦兘鐩存帴鐢═hreadPoolExecutor鏋勯€犲嚱鏁帮紝鍙傛暟鏄庢槑鐧界櫧鍐欑潃锛屾瘮鐢‥xecutors宸ュ叿绫诲畨蹇冨浜嗐€備綘涓婃墜璇曡瘯锛屼繚鍑嗘墦寮€鏂颁笘鐣岀殑澶ч棬锛?/p>