偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

開(kāi)發(fā) 前端
對(duì)于我們編程養(yǎng)成良好的習(xí)慣還是很有幫助的,最近我在看到并發(fā)這一規(guī)約的時(shí)候,他們就明確了一點(diǎn):線(xiàn)程池不允許使用 Executors來(lái)創(chuàng)建。

哈嘍,大家好,我是了不起。

阿里作為國(guó)內(nèi)Java使用最多的大廠,他出版了一部《阿里巴巴Java開(kāi)發(fā)手冊(cè)》,不知道大家看過(guò)沒(méi),沒(méi)有看過(guò)的話(huà),建議大家看看。

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

在多線(xiàn)程編程中,線(xiàn)程池是一種重要的資源管理工具,用于提高程序效率和降低資源消耗。

Java通過(guò)java.util.concurrent包提供了豐富的線(xiàn)程池管理工具,其中Executors類(lèi)是創(chuàng)建線(xiàn)程池的常用工具。

然而,像阿里巴巴這樣的大型技術(shù)公司卻建議開(kāi)發(fā)者避免使用Executors來(lái)創(chuàng)建線(xiàn)程池。為什么會(huì)有這樣的建議呢?

1、文檔出處

圖片圖片

2、Executors類(lèi)的問(wèn)題

Executors類(lèi)提供了幾種快捷方法來(lái)創(chuàng)建不同類(lèi)型的線(xiàn)程池,例如newFixedThreadPool、newCachedThreadPool和newSingleThreadExecutor等。這些方法雖然使用方便,但存在以下幾個(gè)問(wèn)題:

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

Executors使用的默認(rèn)線(xiàn)程工廠創(chuàng)建的線(xiàn)程都是非守護(hù)線(xiàn)程,且沒(méi)有設(shè)置線(xiàn)程名稱(chēng)和優(yōu)先級(jí)。這在某些應(yīng)用場(chǎng)景中可能不是最佳選擇。

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

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

1.3 缺乏靈活性和透明度

使用Executors快捷方法創(chuàng)建的線(xiàn)程池隱藏了許多重要的配置細(xì)節(jié),比如線(xiàn)程數(shù)量和任務(wù)隊(duì)列類(lèi)型,這降低了配置的靈活性和透明度。

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

鑒于上述問(wèn)題,阿里巴巴在其Java開(kāi)發(fā)手冊(cè)中建議開(kāi)發(fā)者不要使用Executors類(lèi)的快捷方法創(chuàng)建線(xiàn)程池,

那么我們應(yīng)該如何創(chuàng)建線(xiàn)程池呢?

答案就是使用:ThreadPoolExecutor。

我們可以看下這個(gè)類(lèi):

圖片圖片

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

所以,創(chuàng)建高效和可靠的線(xiàn)程池時(shí)應(yīng)考慮以下幾點(diǎn):

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

下面給出一段最佳實(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) {
        // 核心線(xiàn)程數(shù)
        int corePoolSize = 5;
        // 最大線(xiàn)程數(shù)
        int maximumPoolSize = 10;
        // 當(dāng)線(xiàn)程數(shù)大于核心線(xiàn)程數(shù)時(shí),多余空閑線(xiàn)程的存活時(shí)間
        long keepAliveTime = 5000;
        // 時(shí)間單位,這里使用毫秒
        TimeUnit unit = TimeUnit.MILLISECONDS;

        // 任務(wù)隊(duì)列,使用有界隊(duì)列可以避免資源耗盡的問(wèn)題
        ArrayBlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(100);

        // 創(chuàng)建線(xiàn)程池
        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)閉線(xiàn)程池
        executor.shutdown();
    }
}

這段代碼展示了如何使用 ThreadPoolExecutor 來(lái)創(chuàng)建一個(gè)自定義的線(xiàn)程池。以下是關(guān)鍵配置的說(shuō)明:

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

創(chuàng)建線(xiàn)程池后,通過(guò) execute 方法提交任務(wù)。最后,使用 shutdown 方法來(lái)關(guān)閉線(xiàn)程池,以釋放資源。

責(zé)任編輯:武曉燕 來(lái)源: Java技術(shù)指北
相關(guān)推薦

2024-02-28 07:37:53

JavaExecutors工具

2019-11-13 14:38:34

Executors阿里線(xiàn)程池

2025-04-17 08:47:23

2021-11-11 15:25:28

@AsyncJava線(xiàn)程池

2014-04-25 10:05:42

OpenStack私有云公共云

2024-02-20 22:13:49

SQL語(yǔ)句編程

2020-06-23 14:09:49

枚舉JDK場(chǎng)景

2020-04-29 14:10:44

Java線(xiàn)程池編程語(yǔ)言

2022-12-06 08:26:16

SpringAOPthis調(diào)用方法

2014-11-21 10:50:26

JavaString

2011-03-08 12:59:38

proftpd

2017-07-03 13:33:42

AndroidItemDecorat

2020-12-15 10:00:31

MySQL數(shù)據(jù)庫(kù)text

2025-01-14 07:00:00

線(xiàn)程池ExecutorsJava

2011-04-14 09:30:15

集合框架

2024-07-29 08:20:10

2010-05-11 10:29:06

Unix awk

2014-05-19 15:52:57

Apache StraApache

2021-08-04 17:20:30

阿里巴巴AsyncJava

2024-01-24 11:24:03

C++編程異常處理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)