日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java并发中ExecutorService的使用

發(fā)布時間:2024/2/28 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java并发中ExecutorService的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 創(chuàng)建ExecutorService
    • 為ExecutorService分配Tasks
    • 關(guān)閉ExecutorService
    • Future
    • ScheduledExecutorService
    • ExecutorService和 Fork/Join

java并發(fā)中ExecutorService的使用

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

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

創(chuàng)建ExecutorService

通常來說有兩種方法來創(chuàng)建ExecutorService。

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

ExecutorService executor = Executors.newFixedThreadPool(10);

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

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

這里我們使用ThreadPoolExecutor來舉例:

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,可以通過調(diào)用xecute(), submit(), invokeAny(), invokeAll()這幾個方法來實(shí)現(xiàn)。

execute() 返回值是void,他用來提交一個Runnable task。

executorService.execute(runnableTask);

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

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

第一個方法在返回傳入的result。第二個方法返回null。

再看一下callable的使用:

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

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

String result = executorService.invokeAny(callableTasks);

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

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

關(guān)閉ExecutorService

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

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

executorService.shutdown();

shutdownNow()并不保證所有的任務(wù)都被執(zhí)行完畢,它會返回一個未執(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ù),然后再等待一定的時間讓所有的任務(wù)都執(zhí)行完畢,如果超過了給定的時間,則立刻結(jié)束任務(wù)。

Future

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

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

ScheduledExecutorService

ScheduledExecutorService為我們提供了定時執(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);

還有兩個比較相近的方法:

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

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

ExecutorService和 Fork/Join

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

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

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

更多精彩內(nèi)容且看:

  • 區(qū)塊鏈從入門到放棄系列教程-涵蓋密碼學(xué),超級賬本,以太坊,Libra,比特幣等持續(xù)更新
  • Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續(xù)更新
  • Spring 5.X系列教程:滿足你對Spring5的一切想象-持續(xù)更新
  • java程序員從小工到專家成神之路(2020版)-持續(xù)更新中,附詳細(xì)文章教程

更多教程請參考 flydean的博客

總結(jié)

以上是生活随笔為你收集整理的java并发中ExecutorService的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。