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

java并發(fā)中ExecutorService的具體用法

 更新時(shí)間:2025年09月02日 11:15:47   作者:flydean程序那些事  
本文深入探討Java中的ExecutorService框架,介紹其創(chuàng)建方法、任務(wù)分配、關(guān)閉策略及Future、ScheduledExecutorService的使用,對(duì)比Fork/Join框架,提供豐富的代碼示例,感興趣的朋友跟隨小編一起看看吧

ExecutorService是java中的一個(gè)異步執(zhí)行的框架,通過(guò)使用ExecutorService可以方便的創(chuàng)建多線程執(zhí)行環(huán)境。

本文將會(huì)詳細(xì)的講解ExecutorService的具體使用。

創(chuàng)建ExecutorService

通常來(lái)說(shuō)有兩種方法來(lái)創(chuàng)建ExecutorService。

第一種方式是使用Executors中的工廠類方法,例如:

ExecutorService executor = Executors.newFixedThreadPool(10);

除了newFixedThreadPool方法之外,Executors還包含了很多創(chuàng)建ExecutorService的方法。

第二種方法是直接創(chuàng)建一個(gè)ExecutorService, 因?yàn)镋xecutorService是一個(gè)interface,我們需要實(shí)例化ExecutorService的一個(gè)實(shí)現(xiàn)。

這里我們使用ThreadPoolExecutor來(lái)舉例:

ExecutorService executorService =
            new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
                    new LinkedBlockingQueue<Runnable>());

為ExecutorService分配Tasks

ExecutorService可以執(zhí)行Runnable和Callable的task。其中Runnable是沒有返回值的,而Callable是有返回值的。我們分別看一下兩種情況的使用:

Runnable runnableTask = () -> {
    try {
        TimeUnit.MILLISECONDS.sleep(300);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
};
Callable<String> callableTask = () -> {
    TimeUnit.MILLISECONDS.sleep(300);
    return "Task's execution";
};

將task分配給ExecutorService,可以通過(guò)調(diào)用xecute(), submit(), invokeAny(), invokeAll()這幾個(gè)方法來(lái)實(shí)現(xiàn)。

execute() 返回值是void,他用來(lái)提交一個(gè)Runnable task。

executorService.execute(runnableTask);

submit() 返回值是Future,它可以提交Runnable task, 也可以提交Callable task。 提交Runnable的有兩個(gè)方法:

<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);

第一個(gè)方法在返回傳入的result。第二個(gè)方法返回null。

再看一下callable的使用:

Future<String> future = 
  executorService.submit(callableTask);

invokeAny() 將一個(gè)task列表傳遞給executorService,并返回其中的一個(gè)成功返回的結(jié)果。

String result = executorService.invokeAny(callableTasks);

invokeAll() 將一個(gè)task列表傳遞給executorService,并返回所有成功執(zhí)行的結(jié)果:

List<Future<String>> futures = executorService.invokeAll(callableTasks);

關(guān)閉ExecutorService

如果ExecutorService中的任務(wù)運(yùn)行完畢之后,ExecutorService不會(huì)自動(dòng)關(guān)閉。它會(huì)等待接收新的任務(wù)。如果需要關(guān)閉ExecutorService, 我們需要調(diào)用shutdown() 或者 shutdownNow() 方法。

shutdown() 會(huì)立即銷毀ExecutorService,它會(huì)讓ExecutorServic停止接收新的任務(wù),并等待現(xiàn)有任務(wù)全部執(zhí)行完畢再銷毀。

executorService.shutdown();

shutdownNow()并不保證所有的任務(wù)都被執(zhí)行完畢,它會(huì)返回一個(gè)未執(zhí)行任務(wù)的列表:

List<Runnable> notExecutedTasks = executorService.shutdownNow();

oracle推薦的最佳關(guān)閉方法是和awaitTermination一起使用:

executorService.shutdown();
       try {
           if (!executorService.awaitTermination(800, TimeUnit.MILLISECONDS)) {
               executorService.shutdownNow();
           }
       } catch (InterruptedException e) {
           executorService.shutdownNow();
       }

先停止接收任務(wù),然后再等待一定的時(shí)間讓所有的任務(wù)都執(zhí)行完畢,如果超過(guò)了給定的時(shí)間,則立刻結(jié)束任務(wù)。

Future

submit() 和 invokeAll() 都會(huì)返回Future對(duì)象。之前的文章我們已經(jīng)詳細(xì)講過(guò)了Future。 這里就只列舉一下怎么使用:

Future<String> future = executorService.submit(callableTask);
String result = null;
try {
   result = future.get();
} catch (InterruptedException | ExecutionException e) {
   e.printStackTrace();
}

ScheduledExecutorService

ScheduledExecutorService為我們提供了定時(shí)執(zhí)行任務(wù)的機(jī)制。

我們這樣創(chuàng)建ScheduledExecutorService:

ScheduledExecutorService executorService
                = Executors.newSingleThreadScheduledExecutor();

executorService的schedule方法,可以傳入Runnable也可以傳入Callable:

Future<String> future = executorService.schedule(() -> {
        // ...
        return "Hello world";
    }, 1, TimeUnit.SECONDS);
    ScheduledFuture<?> scheduledFuture = executorService.schedule(() -> {
        // ...
    }, 1, TimeUnit.SECONDS);

還有兩個(gè)比較相近的方法:

scheduleAtFixedRate( Runnable command, long initialDelay, long period, TimeUnit unit )
scheduleWithFixedDelay( Runnable command, long initialDelay, long delay, TimeUnit unit ) 

兩者的區(qū)別是前者的period是以任務(wù)開始時(shí)間來(lái)計(jì)算的,后者是以任務(wù)結(jié)束時(shí)間來(lái)計(jì)算。

ExecutorService和 Fork/Join

java 7 引入了Fork/Join框架。 那么兩者的區(qū)別是什么呢?

ExecutorService可以由用戶來(lái)自己控制生成的線程,提供了對(duì)線程更加細(xì)粒度的控制。而Fork/Join則是為了讓任務(wù)更加快速的執(zhí)行完畢。

本文的代碼請(qǐng)參考https://github.com/ddean2009/learn-java-concurrency/tree/master/ExecutorService

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

相關(guān)文章

  • 對(duì)Jpa中Entity關(guān)系映射中mappedBy的全面理解

    對(duì)Jpa中Entity關(guān)系映射中mappedBy的全面理解

    這篇文章主要介紹了對(duì)Jpa中Entity關(guān)系映射中mappedBy的全面理解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Eclipse常用快捷鍵總結(jié)(必看篇)

    Eclipse常用快捷鍵總結(jié)(必看篇)

    下面小編就為大家?guī)?lái)一篇Eclipse常用快捷鍵總結(jié)(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • Mybatis實(shí)現(xiàn)增刪改查(CRUD)實(shí)例代碼

    Mybatis實(shí)現(xiàn)增刪改查(CRUD)實(shí)例代碼

    MyBatis 是支持普通 SQL 查詢,存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架。通過(guò)本文給大家介紹Mybatis實(shí)現(xiàn)增刪改查(CRUD)實(shí)例代碼 ,需要的朋友參考下
    2016-05-05
  • 匯總Java中List 去重的 6 種方法

    匯總Java中List 去重的 6 種方法

    這篇文章主要介紹了匯總Java中List 去重的 6 種方法,文章圍繞主題展開List去重的方法,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • 如何在Java Deeplearning4j中進(jìn)行數(shù)據(jù)加載與預(yù)處理

    如何在Java Deeplearning4j中進(jìn)行數(shù)據(jù)加載與預(yù)處理

    本文介紹了如何在 Deeplearning4j 中加載和預(yù)處理數(shù)據(jù),包括圖像和 CSV 數(shù)據(jù)的加載,以及基本的數(shù)據(jù)標(biāo)準(zhǔn)化和分割操作,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • MyBatis?Generator?ORM層面的代碼自動(dòng)生成器(推薦)

    MyBatis?Generator?ORM層面的代碼自動(dòng)生成器(推薦)

    Mybatis?Generator是一個(gè)專門為?MyBatis和?ibatis框架使用者提供的代碼生成器,也可以快速的根據(jù)數(shù)據(jù)表生成對(duì)應(yīng)的pojo類、Mapper接口、Mapper文件,甚至生成QBC風(fēng)格的查詢對(duì)象,這篇文章主要介紹了MyBatis?Generator?ORM層面的代碼自動(dòng)生成器,需要的朋友可以參考下
    2023-01-01
  • java中Hibernate面試知識(shí)點(diǎn)整理

    java中Hibernate面試知識(shí)點(diǎn)整理

    在本篇文章里小編給大家整理的是一篇關(guān)于java中Hibernate面試知識(shí)點(diǎn)整理內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-01-01
  • SpringBoot中的統(tǒng)一異常處理示例代碼

    SpringBoot中的統(tǒng)一異常處理示例代碼

    本文給大家介紹SpringBoot中的統(tǒng)一異常處理示例代碼,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2026-03-03
  • Spring Boot報(bào)錯(cuò):No session repository could be auto-configured, check your configuration的解決方法

    Spring Boot報(bào)錯(cuò):No session repository could be auto-configured

    這篇文章主要給大家介紹了關(guān)于Spring Boot報(bào)錯(cuò):No session repository could be auto-configured, check your configuration的解決方法,文中給出了詳細(xì)的解決方法,對(duì)遇到這個(gè)問(wèn)題的朋友們具有一定參考價(jià)值,需要的朋友下面來(lái)一起看看吧。
    2017-07-07
  • Java實(shí)現(xiàn)樹形List與扁平List互轉(zhuǎn)的示例代碼

    Java實(shí)現(xiàn)樹形List與扁平List互轉(zhuǎn)的示例代碼

    在平時(shí)的開發(fā)中,我們時(shí)常會(huì)遇到需要將"樹形List"與"扁平List"互轉(zhuǎn)的情況,本文為大家整理了Java實(shí)現(xiàn)樹形List與扁平List互轉(zhuǎn)的示例代碼,希望對(duì)大家有所幫助
    2023-05-05

最新評(píng)論

廊坊市| 泸州市| 固安县| 灵山县| 隆化县| 北辰区| 德保县| 新余市| 隆安县| 和平区| 临安市| 武定县| 海口市| 安庆市| 泰来县| 曲沃县| 海口市| 长子县| 石棉县| 五常市| 永和县| 永年县| 崇义县| 玛曲县| 江西省| 越西县| 江孜县| 阿巴嘎旗| 乐山市| 曲周县| 盐山县| 明溪县| 大邑县| 凌云县| 叙永县| 石屏县| 朝阳区| 灌南县| 锦州市| 大安市| 五台县|