日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

為什么阿里建議你不要使用Executors來創(chuàng)建線程池?

來源: 責(zé)編: 時(shí)間:2024-01-03 09:12:05 210觀看
導(dǎo)讀哈嘍,大家好,我是了不起。阿里作為國內(nèi)Java使用最多的大廠,他出版了一部《阿里巴巴Java開發(fā)手冊(cè)》,不知道大家看過沒,沒有看過的話,建議大家看看。對(duì)于我們編程養(yǎng)成良好的習(xí)慣還是很有幫助的,最近我在看到并發(fā)這一規(guī)約的時(shí)候

哈嘍,大家好,我是了不起。iGh28資訊網(wǎng)——每日最新資訊28at.com

阿里作為國內(nèi)Java使用最多的大廠,他出版了一部《阿里巴巴Java開發(fā)手冊(cè)》,不知道大家看過沒,沒有看過的話,建議大家看看。iGh28資訊網(wǎng)——每日最新資訊28at.com

對(duì)于我們編程養(yǎng)成良好的習(xí)慣還是很有幫助的,最近我在看到并發(fā)這一規(guī)約的時(shí)候,他們就明確了一點(diǎn):線程池不允許使用 Executors來創(chuàng)建。iGh28資訊網(wǎng)——每日最新資訊28at.com

在多線程編程中,線程池是一種重要的資源管理工具,用于提高程序效率和降低資源消耗。iGh28資訊網(wǎng)——每日最新資訊28at.com

Java通過java.util.concurrent包提供了豐富的線程池管理工具,其中Executors類是創(chuàng)建線程池的常用工具。iGh28資訊網(wǎng)——每日最新資訊28at.com

然而,像阿里巴巴這樣的大型技術(shù)公司卻建議開發(fā)者避免使用Executors來創(chuàng)建線程池。為什么會(huì)有這樣的建議呢?iGh28資訊網(wǎng)——每日最新資訊28at.com

1、文檔出處

圖片圖片iGh28資訊網(wǎng)——每日最新資訊28at.com

2、Executors類的問題

Executors類提供了幾種快捷方法來創(chuàng)建不同類型的線程池,例如newFixedThreadPool、newCachedThreadPool和newSingleThreadExecutor等。這些方法雖然使用方便,但存在以下幾個(gè)問題:iGh28資訊網(wǎng)——每日最新資訊28at.com

1.1 默認(rèn)線程工廠的局限性

Executors使用的默認(rèn)線程工廠創(chuàng)建的線程都是非守護(hù)線程,且沒有設(shè)置線程名稱和優(yōu)先級(jí)。這在某些應(yīng)用場景中可能不是最佳選擇。iGh28資訊網(wǎng)——每日最新資訊28at.com

1.2 無限制的任務(wù)隊(duì)列

某些由Executors創(chuàng)建的線程池,如newCachedThreadPool,使用了無限制的任務(wù)隊(duì)列。這意味著如果任務(wù)提交速度超過線程處理速度,會(huì)導(dǎo)致內(nèi)存溢出風(fēng)險(xiǎn)。iGh28資訊網(wǎng)——每日最新資訊28at.com

1.3 缺乏靈活性和透明度

使用Executors快捷方法創(chuàng)建的線程池隱藏了許多重要的配置細(xì)節(jié),比如線程數(shù)量和任務(wù)隊(duì)列類型,這降低了配置的靈活性和透明度。iGh28資訊網(wǎng)——每日最新資訊28at.com

3、如何創(chuàng)建線程池呢?

鑒于上述問題,阿里巴巴在其Java開發(fā)手冊(cè)中建議開發(fā)者不要使用Executors類的快捷方法創(chuàng)建線程池,iGh28資訊網(wǎng)——每日最新資訊28at.com

那么我們應(yīng)該如何創(chuàng)建線程池呢?iGh28資訊網(wǎng)——每日最新資訊28at.com

答案就是使用:ThreadPoolExecutor。iGh28資訊網(wǎng)——每日最新資訊28at.com

我們可以看下這個(gè)類:iGh28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片iGh28資訊網(wǎng)——每日最新資訊28at.com

ThreadPoolExecutor構(gòu)造函數(shù)允許開發(fā)者自定義線程池的多個(gè)參數(shù),包括核心線程數(shù)、最大線程數(shù)、空閑線程存活時(shí)間、任務(wù)隊(duì)列、線程工廠和拒絕策略等。這些自定義的配置可以更好地滿足不同的應(yīng)用需求。iGh28資訊網(wǎng)——每日最新資訊28at.com

所以,創(chuàng)建高效和可靠的線程池時(shí)應(yīng)考慮以下幾點(diǎn):iGh28資訊網(wǎng)——每日最新資訊28at.com

  • 合理設(shè)置線程數(shù)量:線程池大小應(yīng)根據(jù)系統(tǒng)資源和需求合理設(shè)置。
  • 選擇適當(dāng)?shù)娜蝿?wù)隊(duì)列:根據(jù)任務(wù)類型和執(zhí)行策略選擇合適的隊(duì)列類型。
  • 自定義線程工廠:可以設(shè)置更有意義的線程名稱,方便問題追蹤和調(diào)試。
  • 合理的拒絕策略:在任務(wù)隊(duì)列滿時(shí)選擇合適的拒絕策略,如AbortPolicy、CallerRunsPolicy等。

下面給出一段最佳實(shí)踐代碼供大家參考:iGh28資訊網(wǎng)——每日最新資訊28at.com

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)鍵配置的說明:iGh28資訊網(wǎng)——每日最新資訊28at.com

  • corePoolSize(核心線程數(shù)):線程池保持活躍狀態(tài)的線程數(shù)量,即使這些線程處于空閑狀態(tài)。
  • maximumPoolSize(最大線程數(shù)):線程池能夠容納的最大線程數(shù)量。
  • keepAliveTime(線程存活時(shí)間):當(dāng)線程數(shù)量超過核心線程數(shù)時(shí),多余的空閑線程可以存活的時(shí)間。
  • unit(時(shí)間單位):用于 keepAliveTime 的時(shí)間單位。
  • workQueue(任務(wù)隊(duì)列):存儲(chǔ)待執(zhí)行任務(wù)的隊(duì)列。這里使用了 ArrayBlockingQueue 作為有界隊(duì)列,以避免資源耗盡的風(fēng)險(xiǎn)。

創(chuàng)建線程池后,通過 execute 方法提交任務(wù)。最后,使用 shutdown 方法來關(guān)閉線程池,以釋放資源。iGh28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接: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)化不容小覷

下一篇: Python的神奇算術(shù),用代碼輕松求和

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 新宁县| 莱芜市| 龙川县| 宜城市| 沁水县| 昌都县| 广安市| 邵阳市| 青川县| 莒南县| 丹凤县| 灵川县| 扎鲁特旗| 平罗县| 无棣县| 普兰县| 浮山县| 新安县| 沈丘县| 佛坪县| 右玉县| 襄垣县| 绥化市| 东兰县| 禹州市| 浦东新区| 太康县| 翼城县| 天镇县| 霍邱县| 通化县| 高唐县| 江山市| 平遥县| 弥渡县| 黎川县| 丰台区| 宁明县| 凤台县| 南郑县| 临江市|