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

ExecutorService實現(xiàn)獲取線程返回值

 更新時間:2022年08月11日 10:39:58   作者:Maggnno  
這篇文章主要介紹了ExecutorService實現(xiàn)獲取線程返回值,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

什么是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方法相當(dāng)于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;
? ? }
? ? //相當(dāng)于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()時,主線程會堵塞,直至當(dāng)前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)文章

最新評論

奇台县| 高尔夫| 九龙坡区| 阜阳市| 长沙市| 黄浦区| 库尔勒市| 永康市| 肃北| 东辽县| 湟源县| 宿松县| 陆丰市| 西乡县| 霸州市| 田东县| 大厂| 钦州市| 嵊州市| 工布江达县| 清丰县| 高雄市| 丰县| 林口县| 新津县| 乐都县| 阜新| 鹿泉市| 铁岭市| 衡东县| 岳阳县| 修武县| 肇庆市| 乐山市| 水富县| 合阳县| 丹凤县| 永平县| 灌阳县| 丰城市| 绍兴县|