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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

转: Executor类

發(fā)布時(shí)間:2023/12/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转: Executor类 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Executor框架是指java 5中引入的一系列并發(fā)庫(kù)中與executor相關(guān)的一些功能類,其中包括線程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。

他們的關(guān)系為:

?

并發(fā)編程的一種編程方式是把任務(wù)拆分為一些列的小任務(wù),即Runnable,然后在提交給一個(gè)Executor執(zhí)行,Executor.execute(Runnalbe)?。Executor在執(zhí)行時(shí)使用內(nèi)部的線程池完成操作。

一、創(chuàng)建線程池

Executors類,提供了一系列工廠方法用于創(chuàng)先線程池,返回的線程池都實(shí)現(xiàn)了ExecutorService接口。

public static ExecutorService newFixedThreadPool(int nThreads)

創(chuàng)建固定數(shù)目線程的線程池。

public static ExecutorService newCachedThreadPool()

創(chuàng)建一個(gè)可緩存的線程池,調(diào)用execute?將重用以前構(gòu)造的線程(如果線程可用)。如果現(xiàn)有線程沒(méi)有可用的,則創(chuàng)建一個(gè)新線程并添加到池中。終止并從緩存中移除那些已有 60 秒鐘未被使用的線程。

public static ExecutorService newSingleThreadExecutor()

創(chuàng)建一個(gè)單線程化的Executor。

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)

創(chuàng)建一個(gè)支持定時(shí)及周期性的任務(wù)執(zhí)行的線程池,多數(shù)情況下可用來(lái)替代Timer類。

Java代碼??
  • Executor?executor?=?Executors.newFixedThreadPool(10);??
  • Runnable?task?=?new?Runnable()?{??
  • ????@Override??
  • ????public?void?run()?{??
  • ????????System.out.println("task?over");??
  • ????}??
  • };??
  • executor.execute(task);??
  • ??
  • executor?=?Executors.newScheduledThreadPool(10);??
  • ScheduledExecutorService?scheduler?=?(ScheduledExecutorService)?executor;??
  • scheduler.scheduleAtFixedRate(task,?10,?10,?TimeUnit.SECONDS);??
  • ?二、ExecutorService與生命周期

    ExecutorService擴(kuò)展了Executor并添加了一些生命周期管理的方法。一個(gè)Executor的生命周期有三種狀態(tài),運(yùn)行?,關(guān)閉?,終止。Executor創(chuàng)建時(shí)處于運(yùn)行狀態(tài)。當(dāng)調(diào)用ExecutorService.shutdown()后,處于關(guān)閉狀態(tài),isShutdown()方法返回true。這時(shí),不應(yīng)該再想Executor中添加任務(wù),所有已添加的任務(wù)執(zhí)行完畢后,Executor處于終止?fàn)顟B(tài),isTerminated()返回true。

    如果Executor處于關(guān)閉狀態(tài),往Executor提交任務(wù)會(huì)拋出unchecked exception RejectedExecutionException。

    Java代碼??
  • ExecutorService?executorService?=?(ExecutorService)?executor;??
  • while?(!executorService.isShutdown())?{??
  • ????try?{??
  • ????????executorService.execute(task);??
  • ????}?catch?(RejectedExecutionException?ignored)?{??
  • ??????????
  • ????}??
  • }??
  • executorService.shutdown();??
  • ?三、使用Callable,Future返回結(jié)果

    Future<V>代表一個(gè)異步執(zhí)行的操作,通過(guò)get()方法可以獲得操作的結(jié)果,如果異步操作還沒(méi)有完成,則,get()會(huì)使當(dāng)前線程阻塞。FutureTask<V>實(shí)現(xiàn)了Future<V>和Runable<V>。Callable代表一個(gè)有返回值得操作。

    Java代碼??
  • Callable<Integer>?func?=?new?Callable<Integer>(){??
  • ????public?Integer?call()?throws?Exception?{??
  • ????????System.out.println("inside?callable");??
  • ????????Thread.sleep(1000);??
  • ????????return?new?Integer(8);??
  • ????}?????????
  • };????????
  • FutureTask<Integer>?futureTask??=?new?FutureTask<Integer>(func);??
  • Thread?newThread?=?new?Thread(futureTask);??
  • newThread.start();??
  • ??
  • try?{??
  • ????System.out.println("blocking?here");??
  • ????Integer?result?=?futureTask.get();??
  • ????System.out.println(result);??
  • }?catch?(InterruptedException?ignored)?{??
  • }?catch?(ExecutionException?ignored)?{??
  • }??
  • ?ExecutoreService提供了submit()方法,傳遞一個(gè)Callable,或Runnable,返回Future。如果Executor后臺(tái)線程池還沒(méi)有完成Callable的計(jì)算,這調(diào)用返回Future對(duì)象的get()方法,會(huì)阻塞直到計(jì)算完成。

    例子:并行計(jì)算數(shù)組的和。

    Java代碼??
  • package?executorservice;??
  • ??
  • import?java.util.ArrayList;??
  • import?java.util.List;??
  • import?java.util.concurrent.Callable;??
  • import?java.util.concurrent.ExecutionException;??
  • import?java.util.concurrent.ExecutorService;??
  • import?java.util.concurrent.Executors;??
  • import?java.util.concurrent.Future;??
  • import?java.util.concurrent.FutureTask;??
  • ??
  • public?class?ConcurrentCalculator?{??
  • ??
  • ????private?ExecutorService?exec;??
  • ????private?int?cpuCoreNumber;??
  • ????private?List<Future<Long>>?tasks?=?new?ArrayList<Future<Long>>();??
  • ??
  • ????//?內(nèi)部類??
  • ????class?SumCalculator?implements?Callable<Long>?{??
  • ????????private?int[]?numbers;??
  • ????????private?int?start;??
  • ????????private?int?end;??
  • ??
  • ????????public?SumCalculator(final?int[]?numbers,?int?start,?int?end)?{??
  • ????????????this.numbers?=?numbers;??
  • ????????????this.start?=?start;??
  • ????????????this.end?=?end;??
  • ????????}??
  • ??
  • ????????public?Long?call()?throws?Exception?{??
  • ????????????Long?sum?=?0l;??
  • ????????????for?(int?i?=?start;?i?<?end;?i++)?{??
  • ????????????????sum?+=?numbers[i];??
  • ????????????}??
  • ????????????return?sum;??
  • ????????}??
  • ????}??
  • ??
  • ????public?ConcurrentCalculator()?{??
  • ????????cpuCoreNumber?=?Runtime.getRuntime().availableProcessors();??
  • ????????exec?=?Executors.newFixedThreadPool(cpuCoreNumber);??
  • ????}??
  • ??
  • ????public?Long?sum(final?int[]?numbers)?{??
  • ????????//?根據(jù)CPU核心個(gè)數(shù)拆分任務(wù),創(chuàng)建FutureTask并提交到Executor??
  • ????????for?(int?i?=?0;?i?<?cpuCoreNumber;?i++)?{??
  • ????????????int?increment?=?numbers.length?/?cpuCoreNumber?+?1;??
  • ????????????int?start?=?increment?*?i;??
  • ????????????int?end?=?increment?*?i?+?increment;??
  • ????????????if?(end?>?numbers.length)??
  • ????????????????end?=?numbers.length;??
  • ????????????SumCalculator?subCalc?=?new?SumCalculator(numbers,?start,?end);??
  • ????????????FutureTask<Long>?task?=?new?FutureTask<Long>(subCalc);??
  • ????????????tasks.add(task);??
  • ????????????if?(!exec.isShutdown())?{??
  • ????????????????exec.submit(task);??
  • ????????????}??
  • ????????}??
  • ????????return?getResult();??
  • ????}??
  • ??
  • ????/**?
  • ?????*?迭代每個(gè)只任務(wù),獲得部分和,相加返回?
  • ?????*??
  • ?????*?@return?
  • ?????*/??
  • ????public?Long?getResult()?{??
  • ????????Long?result?=?0l;??
  • ????????for?(Future<Long>?task?:?tasks)?{??
  • ????????????try?{??
  • ????????????????//?如果計(jì)算未完成則阻塞??
  • ????????????????Long?subSum?=?task.get();??
  • ????????????????result?+=?subSum;??
  • ????????????}?catch?(InterruptedException?e)?{??
  • ????????????????e.printStackTrace();??
  • ????????????}?catch?(ExecutionException?e)?{??
  • ????????????????e.printStackTrace();??
  • ????????????}??
  • ????????}??
  • ????????return?result;??
  • ????}??
  • ??
  • ????public?void?close()?{??
  • ????????exec.shutdown();??
  • ????}??
  • }??
  • ?Main

    Java代碼??
  • int[]?numbers?=?new?int[]?{?1,?2,?3,?4,?5,?6,?7,?8,?10,?11?};??
  • ConcurrentCalculator?calc?=?new?ConcurrentCalculator();??
  • Long?sum?=?calc.sum(numbers);??
  • System.out.println(sum);??
  • calc.close();??
  • ?四、CompletionService

    在剛在的例子中,getResult()方法的實(shí)現(xiàn)過(guò)程中,迭代了FutureTask的數(shù)組,如果任務(wù)還沒(méi)有完成則當(dāng)前線程會(huì)阻塞,如果我們希望任意字任務(wù)完成后就把其結(jié)果加到result中,而不用依次等待每個(gè)任務(wù)完成,可以使CompletionService。生產(chǎn)者submit()執(zhí)行的任務(wù)。使用者take()已完成的任務(wù),并按照完成這些任務(wù)的順序處理它們的結(jié)果?。也就是調(diào)用CompletionService的take方法是,會(huì)返回按完成順序放回任務(wù)的結(jié)果,CompletionService內(nèi)部維護(hù)了一個(gè)阻塞隊(duì)列BlockingQueue,如果沒(méi)有任務(wù)完成,take()方法也會(huì)阻塞。修改剛才的例子使用CompletionService:

    Java代碼??
  • public?class?ConcurrentCalculator2?{??
  • ??
  • ????private?ExecutorService?exec;??
  • ????private?CompletionService<Long>?completionService;??
  • ??
  • ??
  • ????private?int?cpuCoreNumber;??
  • ??
  • ????//?內(nèi)部類??
  • ????class?SumCalculator?implements?Callable<Long>?{??
  • ????????......??
  • ????}??
  • ??
  • ????public?ConcurrentCalculator2()?{??
  • ????????cpuCoreNumber?=?Runtime.getRuntime().availableProcessors();??
  • ????????exec?=?Executors.newFixedThreadPool(cpuCoreNumber);??
  • ????????completionService?=?new?ExecutorCompletionService<Long>(exec);??
  • ??
  • ??
  • ????}??
  • ??
  • ????public?Long?sum(final?int[]?numbers)?{??
  • ????????//?根據(jù)CPU核心個(gè)數(shù)拆分任務(wù),創(chuàng)建FutureTask并提交到Executor??
  • ????????for?(int?i?=?0;?i?<?cpuCoreNumber;?i++)?{??
  • ????????????int?increment?=?numbers.length?/?cpuCoreNumber?+?1;??
  • ????????????int?start?=?increment?*?i;??
  • ????????????int?end?=?increment?*?i?+?increment;??
  • ????????????if?(end?>?numbers.length)??
  • ????????????????end?=?numbers.length;??
  • ????????????SumCalculator?subCalc?=?new?SumCalculator(numbers,?start,?end);???
  • ????????????if?(!exec.isShutdown())?{??
  • ????????????????completionService.submit(subCalc);??
  • ??
  • ??
  • ????????????}??
  • ??????????????
  • ????????}??
  • ????????return?getResult();??
  • ????}??
  • ??
  • ????/**?
  • ?????*?迭代每個(gè)只任務(wù),獲得部分和,相加返回?
  • ?????*??
  • ?????*?@return?
  • ?????*/??
  • ????public?Long?getResult()?{??
  • ????????Long?result?=?0l;??
  • ????????for?(int?i?=?0;?i?<?cpuCoreNumber;?i++)?{??????????????
  • ????????????try?{??
  • ????????????????Long?subSum?=?completionService.take().get();??
  • ????????????????result?+=?subSum;?????????????
  • ????????????}?catch?(InterruptedException?e)?{??
  • ????????????????e.printStackTrace();??
  • ????????????}?catch?(ExecutionException?e)?{??
  • ????????????????e.printStackTrace();??
  • ????????????}??
  • ????????}??
  • ????????return?result;??
  • ????}??
  • ??
  • ????public?void?close()?{??
  • ????????exec.shutdown();??
  • ????}??
  • } ?
  • 轉(zhuǎn)載于:https://www.cnblogs.com/codershuai/p/4413988.html

    總結(jié)

    以上是生活随笔為你收集整理的转: Executor类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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