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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java面试-Java并发编程(九)——批量获取多条线程的执行结果

發(fā)布時(shí)間:2025/3/20 java 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java面试-Java并发编程(九)——批量获取多条线程的执行结果 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

當(dāng)向線程池提交callable任務(wù)后,我們可能需要一次性獲取所有返回結(jié)果,有三種處理方法。

方法一:自己維護(hù)返回結(jié)果

// 創(chuàng)建一個(gè)線程池 ExecutorService executorService = Executors.newFixedThreadPool(10);// 存儲(chǔ)執(zhí)行結(jié)果的List List<Future<String>> results = new ArrayList<Future<String>>();// 提交10個(gè)任務(wù) for ( int i=0; i<10; i++ ) {Future<String> result = executorService.submit( new Callable<String>(){public String call(){int sleepTime = new Random().nextInt(1000);Thread.sleep(sleepTime);return "線程"+i+"睡了"+sleepTime+"秒";}} );// 將執(zhí)行結(jié)果存入results中results.add( result ); }// 獲取10個(gè)任務(wù)的返回結(jié)果 for ( int i=0; i<10; i++ ) {// 獲取包含返回結(jié)果的future對(duì)象Future<String> future = results.get(i);// 從future中取出執(zhí)行結(jié)果(若尚未返回結(jié)果,則get方法被阻塞,直到結(jié)果被返回為止)String result = future.get();System.out.println(result); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

此方法的弊端:

  • 需要自己創(chuàng)建容器維護(hù)所有的返回結(jié)果,比較麻煩;
  • 從list中遍歷的每個(gè)Future對(duì)象并不一定處于完成狀態(tài),這時(shí)調(diào)用get()方法就會(huì)被阻塞住,如果系統(tǒng)是設(shè)計(jì)成每個(gè)線程完成后就能根據(jù)其結(jié)果繼續(xù)做后面的事,這樣對(duì)于處于list后面的但是先完成的線程就會(huì)增加了額外的等待時(shí)間。
  • 方法二:使用ExecutorService的invokeAll函數(shù)

    本方法能解決第一個(gè)弊端,即并不需要自己去維護(hù)一個(gè)存儲(chǔ)返回結(jié)果的容器。當(dāng)我們需要獲取線程池所有的返回結(jié)果時(shí),只需調(diào)用invokeAll函數(shù)即可。?
    但是,這種方式需要你自己去維護(hù)一個(gè)用于存儲(chǔ)任務(wù)的容器。

    // 創(chuàng)建一個(gè)線程池 ExecutorService executorService = Executors.newFixedThreadPool(10);// 創(chuàng)建存儲(chǔ)任務(wù)的容器 List<Callable<String>> tasks = new ArrayList<Callable<String>>();// 提交10個(gè)任務(wù) for ( int i=0; i<10; i++ ) {Callable<String> task = new Callable<String>(){public String call(){int sleepTime = new Random().nextInt(1000);Thread.sleep(sleepTime);return "線程"+i+"睡了"+sleepTime+"秒";}};executorService.submit( task );// 將task添加進(jìn)任務(wù)隊(duì)列tasks.add( task ); }// 獲取10個(gè)任務(wù)的返回結(jié)果 List<Future<String>> results = executorService.invokeAll( tasks );// 輸出結(jié)果 for ( int i=0; i<10; i++ ) {// 獲取包含返回結(jié)果的future對(duì)象Future<String> future = results.get(i);// 從future中取出執(zhí)行結(jié)果(若尚未返回結(jié)果,則get方法被阻塞,直到結(jié)果被返回為止)String result = future.get();System.out.println(result); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    方法三:使用CompletionService

    CompletionService內(nèi)部維護(hù)了一個(gè)阻塞隊(duì)列,只有執(zhí)行完成的任務(wù)結(jié)果才會(huì)被放入該隊(duì)列,這樣就確保執(zhí)行時(shí)間較短的任務(wù)率先被存入阻塞隊(duì)列中。

    ExecutorService exec = Executors.newFixedThreadPool(10);final BlockingQueue<Future<Integer>> queue = new LinkedBlockingDeque<Future<Integer>>( 10); //實(shí)例化CompletionService final CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>( exec, queue); // 提交10個(gè)任務(wù) for ( int i=0; i<10; i++ ) {executorService.submit( new Callable<String>(){public String call(){int sleepTime = new Random().nextInt(1000);Thread.sleep(sleepTime);return "線程"+i+"睡了"+sleepTime+"秒";}} ); }// 輸出結(jié)果 for ( int i=0; i<10; i++ ) {// 獲取包含返回結(jié)果的future對(duì)象(若整個(gè)阻塞隊(duì)列中還沒有一條線程返回結(jié)果,那么調(diào)用take將會(huì)被阻塞,當(dāng)然你可以調(diào)用poll,不會(huì)被阻塞,若沒有結(jié)果會(huì)返回null,poll和take返回正確的結(jié)果后會(huì)將該結(jié)果從隊(duì)列中刪除)Future<String> future = completionService.take();// 從future中取出執(zhí)行結(jié)果,這里存儲(chǔ)的future已經(jīng)擁有執(zhí)行結(jié)果,get不會(huì)被阻塞String result = future.get();System.out.println(result); }

    總結(jié)

    以上是生活随笔為你收集整理的java面试-Java并发编程(九)——批量获取多条线程的执行结果的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 777精品伊人久久久久大香线蕉 | 国产理论影院 | 国产精品成久久久久三级 | 夜夜高潮夜夜爽国产伦精品 | av中文字幕网站 | av黄色小说 | 国产手机精品视频 | av在线影视 | chinesepron hd videos国产91 | 黑人巨大精品欧美 | 男人的天堂一级片 | 国产尻逼| 日本欧美日韩 | av资源吧首页 | 91影视在线观看 | 欧美性大战xxxxx久久久 | 色5月婷婷 | 欧美午夜久久 | 久久亚洲精品国产 | 精品国产免费一区二区三区 | 欧美激情在线狂野欧美精品 | a国产| 91不卡在线| 久久久久久国产精品三区 | 亚洲av综合av一区二区三区 | 好吊色欧美一区二区三区视频 | 国产一级爱c视频 | 日韩欧美视频在线免费观看 | 欧美播放| 成人在线观看免费视频 | 4388成人网 | 一区二区视频在线观看免费 | 99青草| 久久久久女人精品毛片九一 | 在线免费h | 捆绑japanhdxxxxvideos | 亚洲国产aⅴ成人精品无吗 日韩乱论 | 日韩av女优在线观看 | 禁止18在线观看 | 日本免费一二三区 | 国产精品白嫩极品美女视频 | 一个人在线免费观看www | 一本黄色片 | 在线a级| 国产视频一区二区三区四区 | 一区二区三区高清 | 中文字幕色哟哟 | 亚洲天堂男人网 | 国产一级淫 | 欧美怡红院视频一区二区三区 | 91高潮大合集爽到抽搐 | 国产在线精品播放 | 麻豆视频软件 | 国内自拍2020 | 呦女精品 | 色天天综合| 日本激情视频在线观看 | 婷婷玖玖 | 精品韩国一区二区三区 | 毛片免费全部无码播放 | 在线一级视频 | 性欧美丰满熟妇xxxx性久久久 | 夜夜狠狠擅视频 | 牛牛影视一区二区 | 中文字幕电影一区 | 伊人五月综合 | 精品人妻中文无码av在线 | 欧美天天视频 | 久久久久久蜜桃 | 伊人网在线视频观看 | 久久婷婷影视 | 色综合成人 | 久久久久国产精品区片区无码 | 国产伊人自拍 | 性色在线观看 | 99九九热| 免费一区二区视频 | www.日本色| 亚洲精品~无码抽插 | 婷综合 | 99嫩草| 欧美美女一区二区 | 99午夜视频| 性开放的欧美大片 | 一级黄色a视频 | 69xav| 亚洲人午夜射精精品日韩 | 他趴在我两腿中间添得好爽在线看 | 欧美群交射精内射颜射潮喷 | 天天艹夜夜艹 | 免费观看黄色av | 丰满尤物白嫩啪啪少妇 | 人妻少妇精品一区二区 | 欧美性动态图 | 精品一区二区三区三区 | 奇米第四色在线 | 男女男精品视频站 | av成人天堂 | www日韩精品 |