哈嘍,大家好,我是了不起。
阿里作為國內(nèi)Java使用最多的大廠,他出版了一部《阿里巴巴Java開發(fā)手冊(cè)》,不知道大家看過沒,沒有看過的話,建議大家看看。
對(duì)于我們編程養(yǎng)成良好的習(xí)慣還是很有幫助的,最近我在看到并發(fā)這一規(guī)約的時(shí)候,他們就明確了一點(diǎn):線程池不允許使用 Executors來創(chuàng)建。
在多線程編程中,線程池是一種重要的資源管理工具,用于提高程序效率和降低資源消耗。
Java通過java.util.concurrent包提供了豐富的線程池管理工具,其中Executors類是創(chuàng)建線程池的常用工具。
然而,像阿里巴巴這樣的大型技術(shù)公司卻建議開發(fā)者避免使用Executors來創(chuàng)建線程池。為什么會(huì)有這樣的建議呢?
圖片
Executors類提供了幾種快捷方法來創(chuàng)建不同類型的線程池,例如newFixedThreadPool、newCachedThreadPool和newSingleThreadExecutor等。這些方法雖然使用方便,但存在以下幾個(gè)問題:
Executors使用的默認(rèn)線程工廠創(chuàng)建的線程都是非守護(hù)線程,且沒有設(shè)置線程名稱和優(yōu)先級(jí)。這在某些應(yīng)用場景中可能不是最佳選擇。
某些由Executors創(chuàng)建的線程池,如newCachedThreadPool,使用了無限制的任務(wù)隊(duì)列。這意味著如果任務(wù)提交速度超過線程處理速度,會(huì)導(dǎo)致內(nèi)存溢出風(fēng)險(xiǎn)。
使用Executors快捷方法創(chuàng)建的線程池隱藏了許多重要的配置細(xì)節(jié),比如線程數(shù)量和任務(wù)隊(duì)列類型,這降低了配置的靈活性和透明度。
鑒于上述問題,阿里巴巴在其Java開發(fā)手冊(cè)中建議開發(fā)者不要使用Executors類的快捷方法創(chuàng)建線程池,
那么我們應(yīng)該如何創(chuàng)建線程池呢?
答案就是使用:ThreadPoolExecutor。
我們可以看下這個(gè)類:
圖片
ThreadPoolExecutor構(gòu)造函數(shù)允許開發(fā)者自定義線程池的多個(gè)參數(shù),包括核心線程數(shù)、最大線程數(shù)、空閑線程存活時(shí)間、任務(wù)隊(duì)列、線程工廠和拒絕策略等。這些自定義的配置可以更好地滿足不同的應(yīng)用需求。
所以,創(chuàng)建高效和可靠的線程池時(shí)應(yīng)考慮以下幾點(diǎn):
下面給出一段最佳實(shí)踐代碼供大家參考:
import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class ThreadPoolExample { public static void main(String[] args) { // 核心線程數(shù) int corePoolSize = 5; // 最大線程數(shù) int maximumPoolSize = 10; // 當(dāng)線程數(shù)大于核心線程數(shù)時(shí),多余空閑線程的存活時(shí)間 long keepAliveTime = 5000; // 時(shí)間單位,這里使用毫秒 TimeUnit unit = TimeUnit.MILLISECONDS; // 任務(wù)隊(duì)列,使用有界隊(duì)列可以避免資源耗盡的問題 ArrayBlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(100); // 創(chuàng)建線程池 ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue ); // 示例任務(wù)提交 for (int i = 0; i < 20; i++) { int finalI = i; executor.execute(() -> { System.out.println("Executing task " + finalI + " using thread " + Thread.currentThread().getName()); try { // 模擬任務(wù)執(zhí)行時(shí)間 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }); } // 關(guān)閉線程池 executor.shutdown(); }}
這段代碼展示了如何使用 ThreadPoolExecutor 來創(chuàng)建一個(gè)自定義的線程池。以下是關(guān)鍵配置的說明:
創(chuàng)建線程池后,通過 execute 方法提交任務(wù)。最后,使用 shutdown 方法來關(guān)閉線程池,以釋放資源。
本文鏈接:http://www.www897cc.com/showinfo-26-56555-0.html為什么阿里建議你不要使用Executors來創(chuàng)建線程池?
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: 性能篇:字符串性能優(yōu)化不容小覷