最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 如何創(chuàng)建和使用ExecutorService

 更新時(shí)間:2025年05月08日 15:10:21   作者:憶愿  
ExecutorService 是 Java 中用來(lái)管理和執(zhí)行多線程任務(wù)的一種高級(jí)工具,可以有效地管理線程的生命周期和任務(wù)的執(zhí)行過(guò)程,特別是在需要處理大量并發(fā)任務(wù)時(shí)尤為有用,本文給大家介紹Java 如何創(chuàng)建和使用ExecutorService,感興趣的朋友一起看看吧

一、什么是ExecutorService?

ExecutorService 是 Java 中用來(lái)管理和執(zhí)行多線程任務(wù)的一種高級(jí)工具??梢杂行У毓芾砭€程的生命周期和任務(wù)的執(zhí)行過(guò)程,特別是在需要處理大量并發(fā)任務(wù)時(shí)尤為有用。

生動(dòng)形象的比喻,ExecutorService 就像是一個(gè)管理者,你可以把任務(wù)交給它,它會(huì)根據(jù)需要?jiǎng)?chuàng)建線程,并且確保任務(wù)按照你的要求執(zhí)行。

在實(shí)際編程中,可以通過(guò) ExecutorService 來(lái)避免直接操作線程,這樣做通常更安全和更高效。

可以創(chuàng)建一個(gè) ExecutorService 并告訴它需要執(zhí)行的任務(wù),ExecutorService 會(huì)根據(jù)需要?jiǎng)?chuàng)建線程,并在執(zhí)行完任務(wù)后將線程回收以便重用,這樣可以節(jié)省資源并提高性能。

看一個(gè)簡(jiǎn)單的例子:

假設(shè)有一個(gè)需要處理大量數(shù)據(jù)的任務(wù),可以創(chuàng)建一個(gè) ExecutorService,并告訴它希望同時(shí)執(zhí)行多少個(gè)任務(wù)。ExecutorService 會(huì)根據(jù)設(shè)定的自動(dòng)創(chuàng)建和管理線程,確保這些任務(wù)可以并發(fā)執(zhí)行而不會(huì)互相干擾。這種方式比手動(dòng)管理線程更容易,并且可以更好地利用計(jì)算機(jī)的多核處理能力。

// 創(chuàng)建一個(gè)固定大小的線程池,最多同時(shí)執(zhí)行兩個(gè)任務(wù)
ExecutorService executor = Executors.newFixedThreadPool(2);
// 提交兩個(gè)任務(wù)給線程池執(zhí)行
executor.submit(() -> {
    System.out.println("任務(wù)1 正在執(zhí)行...");
    // 這里放置任務(wù)1的具體代碼邏輯
});
executor.submit(() -> {
    System.out.println("任務(wù)2 正在執(zhí)行...");
    // 這里放置任務(wù)2的具體代碼邏輯
});
// 關(guān)閉線程池
executor.shutdown();

二、ExecutorService的核心功能

創(chuàng)建固定大小的線程池

// 創(chuàng)建一個(gè)包含5個(gè)線程的固定大小線程池
ExecutorService executor = Executors.newFixedThreadPool(5); 

使用場(chǎng)景: 當(dāng)需要限制同時(shí)執(zhí)行的線程數(shù)量時(shí),可以使用固定大小的線程池。這樣可以控制并發(fā)線程數(shù)量,避免系統(tǒng)資源被過(guò)度消耗。

創(chuàng)建可緩存的線程池

// 創(chuàng)建一個(gè)可根據(jù)需要自動(dòng)擴(kuò)展的線程池
ExecutorService executor = Executors.newCachedThreadPool(); 

使用場(chǎng)景: 當(dāng)有大量短期異步任務(wù)需要處理時(shí),可以使用可緩存線程池。它會(huì)根據(jù)任務(wù)的增加自動(dòng)創(chuàng)建新線程,并在空閑時(shí)重用現(xiàn)有線程,從而提高性能。

提交 Runnable 任務(wù)

executor.submit(() -> {
    System.out.println("執(zhí)行任務(wù)1");
    // 這里放置任務(wù)1的具體代碼邏輯
});

使用場(chǎng)景: 當(dāng)需要執(zhí)行沒(méi)有返回值的簡(jiǎn)單任務(wù)時(shí),可以提交實(shí)現(xiàn)了 Runnable 接口的任務(wù)。例如,清理臨時(shí)文件、發(fā)送通知等異步操作。

提交 Callable 任務(wù)并獲取結(jié)果

Future<Integer> future = executor.submit(() -> {
    System.out.println("執(zhí)行任務(wù)2");
    // 這里放置任務(wù)2的具體代碼邏輯
    // 返回任務(wù)執(zhí)行結(jié)果
    return fu;  
});
try {
    // 獲取任務(wù)執(zhí)行結(jié)果,可能會(huì)阻塞直到任務(wù)完成
    Integer result = future.get();  
    System.out.println("任務(wù)2 的結(jié)果是:" + result);
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
}

使用場(chǎng)景: 當(dāng)需要執(zhí)行有返回值的任務(wù),并且可能需要等待任務(wù)完成后獲取結(jié)果時(shí),可以提交實(shí)現(xiàn)了 Callable 接口的任務(wù),并使用 Future 對(duì)象獲取任務(wù)的返回值。

擴(kuò)展:

Future 接口提供了一個(gè)特殊的阻塞方法 get(),它返回 Callable 任務(wù)執(zhí)行的實(shí)際結(jié)果,但如果是 Runnable 任務(wù),則只會(huì)返回 null。

如果調(diào)用get()方法時(shí)任務(wù)仍在運(yùn)行,那么調(diào)用將會(huì)一直被執(zhí)阻塞,直到任務(wù)正確執(zhí)行完畢并且結(jié)果可用時(shí)才返回。

get() 方法是阻塞的,而且并不知道要阻塞多長(zhǎng)時(shí)間。因此可能導(dǎo)致應(yīng)用程序的性能降低。如果結(jié)果數(shù)據(jù)并不重要,那么我們可以使用超時(shí)機(jī)制來(lái)避免長(zhǎng)時(shí)間阻塞。

// 等待 200 毫秒
String result = future.get(200, TimeUnit.MILLISECONDS);

這個(gè)get() 的重載,第一個(gè)參數(shù)為超時(shí)的時(shí)間,第二個(gè)參數(shù)為時(shí)間的單位。

控制線程池的關(guān)閉

// 平穩(wěn)關(guān)閉線程池,等待所有任務(wù)執(zhí)行完成
executor.shutdown(); 

使用場(chǎng)景: 當(dāng)不再需要使用 ExecutorService 時(shí),應(yīng)該調(diào)用 shutdown() 方法來(lái)關(guān)閉線程池。確保已提交的任務(wù)能夠完成執(zhí)行,避免資源泄漏和任務(wù)丟失的問(wèn)題。

三、如何創(chuàng)建和使用ExecutorService?

使用 Executors 工廠類來(lái)創(chuàng)建不同類型的 ExecutorService。

newFixedThreadPool(int n) 可以創(chuàng)建一個(gè)固定大小的線程池。

newCachedThreadPool() 則可以創(chuàng)建一個(gè)根據(jù)需要自動(dòng)擴(kuò)展的線程池。

實(shí)際案例:

創(chuàng)建一個(gè)簡(jiǎn)單的多線程程序,使用 ExecutorService 執(zhí)行一批任務(wù),并獲取它們的執(zhí)行結(jié)果。

public static void main(String[] args) {
        // 創(chuàng)建一個(gè)固定大小為3的線程池
        ExecutorService executor = Executors.newFixedThreadPool(3);
        // 創(chuàng)建一個(gè)列表來(lái)保存提交的任務(wù)
        List<Future<Integer>> futures = new ArrayList<>();
        // 提交10個(gè)任務(wù),每個(gè)任務(wù)返回任務(wù)ID乘以2的結(jié)果
        for (int i = 1; i <= 10; i++) {
            final int taskId = i;
            // 提交 Callable 任務(wù),并將 Future 對(duì)象保存到列表中
            Future<Integer> future = executor.submit(() -> {
                System.out.println("任務(wù) " + taskId + " 開(kāi)始執(zhí)行");
                // 模擬任務(wù)執(zhí)行耗時(shí)
                Thread.sleep(2000);  
                // 返回任務(wù)的結(jié)果
                return taskId * 2;   
            });
            // 將 Future 對(duì)象添加到列表中
            futures.add(future);  
        }
        // 等待所有任務(wù)完成,并打印各任務(wù)的執(zhí)行結(jié)果
        for (Future<Integer> future : futures) {
            try {
                // 獲取任務(wù)執(zhí)行結(jié)果,可能會(huì)阻塞直到任務(wù)完成
                Integer result = future.get();  
                System.out.println("任務(wù)結(jié)果: " + result);
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }
        // 關(guān)閉線程池
        executor.shutdown();
    }
// 輸出結(jié)果
任務(wù) 1 開(kāi)始執(zhí)行
任務(wù) 2 開(kāi)始執(zhí)行
任務(wù) 3 開(kāi)始執(zhí)行
任務(wù)結(jié)果: 2
任務(wù)結(jié)果: 4
任務(wù) 4 開(kāi)始執(zhí)行
任務(wù)結(jié)果: 6
任務(wù) 5 開(kāi)始執(zhí)行
任務(wù)結(jié)果: 8
任務(wù) 6 開(kāi)始執(zhí)行
任務(wù)結(jié)果: 10
任務(wù) 7 開(kāi)始執(zhí)行
任務(wù)結(jié)果: 12
任務(wù) 8 開(kāi)始執(zhí)行
任務(wù)結(jié)果: 14
任務(wù) 9 開(kāi)始執(zhí)行
任務(wù)結(jié)果: 16
任務(wù) 10 開(kāi)始執(zhí)行
任務(wù)結(jié)果: 18
任務(wù)結(jié)果: 20

時(shí)間不能增添一個(gè)人的生命,然而珍惜光陰卻可使生命變得更有價(jià)值

到此這篇關(guān)于Java ExecutorService的文章就介紹到這了,更多相關(guān)Java ExecutorService內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中4種校驗(yàn)注解詳解(值校驗(yàn)、范圍校驗(yàn)、長(zhǎng)度校驗(yàn)、格式校驗(yàn))

    Java中4種校驗(yàn)注解詳解(值校驗(yàn)、范圍校驗(yàn)、長(zhǎng)度校驗(yàn)、格式校驗(yàn))

    這篇文章主要給大家介紹了關(guān)于Java中4種校驗(yàn)注解詳解的相關(guān)資料,分別包括值校驗(yàn)、范圍校驗(yàn)、長(zhǎng)度校驗(yàn)、格式校驗(yàn)等,Java注解(Annotation)是一種元數(shù)據(jù),它可以被添加到Java代碼中,并可以提供額外的信息和指令,需要的朋友可以參考下
    2023-08-08
  • java類中元素初始化順序詳解

    java類中元素初始化順序詳解

    對(duì)于靜態(tài)變量、靜態(tài)初始化塊、變量、初始化塊、構(gòu)造器,它們的初始化順序依次是(靜態(tài)變量、靜態(tài)初始化塊)>(變量、初始化塊)>構(gòu)造器
    2013-08-08
  • Java中將接口返回的字節(jié)串轉(zhuǎn)為文件詳解

    Java中將接口返回的字節(jié)串轉(zhuǎn)為文件詳解

    這篇文章主要給大家介紹了關(guān)于Java中將接口返回的字節(jié)串轉(zhuǎn)為文件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-11-11
  • Java NIO三大組件與ByteBuffer深入理解及使用

    Java NIO三大組件與ByteBuffer深入理解及使用

    這篇文章主要介紹了Java NIO三大組件與ByteBuffer,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-01-01
  • 智能手表開(kāi)發(fā)API接口

    智能手表開(kāi)發(fā)API接口

    這篇文章主要介紹了智能手表開(kāi)發(fā)API接口,使用圖靈機(jī)器人平臺(tái)接口實(shí)現(xiàn)天氣預(yù)報(bào),非常簡(jiǎn)單實(shí)用,這里推薦給大家。
    2015-03-03
  • IDEA報(bào)錯(cuò)Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver com.mysql.jdbc.Driver爆紅

    IDEA報(bào)錯(cuò)Caused by: java.lang.ClassNotFoundException:

    這篇文章主要介紹了IDEA報(bào)錯(cuò)Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver com.mysql.jdbc.Driver爆紅,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-10-10
  • Spring Boot 連接LDAP的方法

    Spring Boot 連接LDAP的方法

    這篇文章主要介紹了Spring Boot 連接LDAP的方法,僅僅涉及基本的使用ODM來(lái)快速實(shí)現(xiàn)LDAP增刪改查操作。具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-12-12
  • java前后端傳值,參數(shù)有集合類型的數(shù)據(jù)時(shí)的兩種操作方式

    java前后端傳值,參數(shù)有集合類型的數(shù)據(jù)時(shí)的兩種操作方式

    這篇文章主要介紹了java前后端傳值,參數(shù)有集合類型的數(shù)據(jù)時(shí)的兩種操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Spring MVC獲取參數(shù)和自定義參數(shù)類型轉(zhuǎn)換器及編碼過(guò)濾器

    Spring MVC獲取參數(shù)和自定義參數(shù)類型轉(zhuǎn)換器及編碼過(guò)濾器

    這篇文章主要為大家詳細(xì)介紹了Spring MVC獲取參數(shù)和自定義參數(shù)類型轉(zhuǎn)換器及編碼過(guò)濾器,文中通過(guò)代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-06-06
  • @Autowired注解注入的xxxMapper報(bào)錯(cuò)問(wèn)題及解決

    @Autowired注解注入的xxxMapper報(bào)錯(cuò)問(wèn)題及解決

    這篇文章主要介紹了@Autowired注解注入的xxxMapper報(bào)錯(cuò)問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評(píng)論

叙永县| 增城市| 瑞安市| 杭锦后旗| 凌云县| 普兰县| 迁安市| 五大连池市| 南京市| 克山县| 饶河县| 嘉兴市| 常熟市| 阳城县| 阿拉尔市| 五台县| 吕梁市| 凉城县| 南涧| 八宿县| 广河县| 靖西县| 盱眙县| 苗栗县| 云阳县| 南漳县| 响水县| 玛多县| 彭州市| 新民市| 合阳县| 灵宝市| 成安县| 衡东县| 高阳县| 大理市| 曲阜市| 育儿| 紫金县| 建昌县| 钦州市|