ExecutorService實現(xiàn)獲取線程返回值
什么是ExecutorService?
ExecutorService是java.util.concurrent包中的一個線程池實現(xiàn)接口。其有兩個實現(xiàn)類:ThreadPoolExecutor 和 ScheduledThreadPoolExecutor。分別用來實現(xiàn)普通線程池和延遲任務(wù)線程池。普通線程池通過配置線程池大小,能有效管理線程的調(diào)度,在執(zhí)行大量異步線程時提高程序的性能。延遲任務(wù)線程池可控制在給定多長的延遲后執(zhí)行線程。想要實現(xiàn)獲取線程的返回值,可以通過ThreadPoolExecutor及其子類管理線程。
實現(xiàn)帶返回值的Callable子類
創(chuàng)建一個線程類實現(xiàn)Callable接口,重寫call方法,其中call方法相當于Thread子類中的run方法。其內(nèi)容為線程運行時所執(zhí)行的業(yè)務(wù)。
ThreadWithCallable.java
package thread; import java.util.concurrent.Callable; /** ?* ?一個包含返回值的線程類 ?* @author xiezd 2018-01-14 21:40 ?* ?*/ public class ThreadWithCallback implements Callable{ ? ? private int number; ? ? public ThreadWithCallback(int number){ ? ? ? ? this.number = number; ? ? } ? ? //相當于Thread的run方法 ? ? @Override ? ? public Object call() throws Exception { ? ? ? ? long begin = System.currentTimeMillis(); ? ? ? ? int index = (int)(Math.random() * 99999999); ? ? ? ? int result = number; ? ? ? ? //隨便寫的 ? ? ? ? for (int i = 1; i < index; i++) { ? ? ? ? ? ? result = (result / i ) * index; ? ? ? ? } ? ? ? ? long end = System.currentTimeMillis(); ? ? ? ? return "計算數(shù)值為" + number + "的線程,花費:" + (end - begin) + "毫秒。"; ? ? } }
創(chuàng)建線程池測試
編寫一個測試類:
1.通過Excutors工廠類獲取一個固定大小的線程池對象。
2.調(diào)用線程池對象的submit方法,參數(shù)為一個線程對象,返回值為Future對象。
3.調(diào)用Future對象的get方法獲取線程返回值。
4.關(guān)閉線程池。
App.java
package thread; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; /** ?* @author xiezd 2018-01-14 21:49 ?*/ public class App { ? ? public static void main(String[] args) { ? ? ? ? ExecutorService executors = Executors.newFixedThreadPool(10); ? ? ? ? try { ? ? ? ? ? ? /* 啟動線程時會返回一個Future對象。 ? ? ? ? ? ? ?* 可以通過future對象獲取現(xiàn)成的返回值。 ? ? ? ? ? ? ?* 在執(zhí)行future.get()時,主線程會堵塞,直至當前future線程返回結(jié)果。 ? ? ? ? ? ? ?*/ ? ? ? ? ? ? Future future1 = executors.submit(new ThreadWithCallback(20)); ? ? ? ? ? ? Future future2 = executors.submit(new ThreadWithCallback(30)); ? ? ? ? ? ? System.out.println(future1.get()); ? ? ? ? ? ? System.out.println(future2.get()); ? ? ? ? } catch (InterruptedException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } catch (ExecutionException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? }finally { ? ? ? ? ? ? executors.shutdown(); ? ? ? ? } ? ? } }
注:在future調(diào)用get方法時,主線程會阻塞(sè),直到該線程執(zhí)行完畢返回對象了只有才繼續(xù)運行。
如果要執(zhí)行n個線程,可以把future放入Set集合中,在所有線程都啟動完畢后,遍歷Set取出返回值。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java?properties?和?yml?的區(qū)別解析
properties和yml都是Spring?Boot支持的兩種配置文件,它們可以看做Spring?Boot在不同時期的兩種“產(chǎn)品”,這篇文章主要介紹了Java?properties?和?yml?的區(qū)別,需要的朋友可以參考下2023-02-02SpringBoot整合FTP實現(xiàn)文件傳輸?shù)牟襟E
這篇文章主要給大家介紹了SpringBoot整合FTP實現(xiàn)文件傳輸?shù)牟襟E,文中的流程步驟和代碼示例介紹的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-11-11Springboot微服務(wù)打包Docker鏡像流程解析
這篇文章主要介紹了Springboot微服務(wù)打包Docker鏡像流程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08如何更優(yōu)雅地獲取spring boot yml中的值
這篇文章主要給大家介紹了關(guān)于如何更優(yōu)雅地獲取spring boot yml中值的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06關(guān)于Spring?Cloud的熔斷器監(jiān)控問題
Turbine是一個聚合Hystrix監(jiān)控數(shù)據(jù)的工具,它可將所有相關(guān)/hystrix.stream端點的數(shù)據(jù)聚合到一個組合的/turbine.stream中,從而讓集群的監(jiān)控更加方便,接下來通過本文給大家介紹Spring?Cloud的熔斷器監(jiān)控,感興趣的朋友一起看看吧2022-01-01springboot如何實現(xiàn)導(dǎo)入其他配置類
這篇文章主要介紹了springboot如何實現(xiàn)導(dǎo)入其他配置類問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11