溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用CompletionService結(jié)合ExecutorService批處理任務(wù)

發(fā)布時(shí)間:2020-08-01 11:32:11 來源:網(wǎng)絡(luò) 閱讀:431 作者:劉元興 欄目:網(wǎng)絡(luò)安全

CompletionService用于提交一組Callable任務(wù),其take方法返回已完成的一個(gè)Callable任務(wù)對(duì)應(yīng)的Future對(duì)象。

如果你向Executor提交了一個(gè)批處理任務(wù),并且希望在它們完成后獲得結(jié)果。為此你可以將每個(gè)任務(wù)的Future保存進(jìn)一個(gè)集合,然后循環(huán)這個(gè)集合調(diào)用Future的get()取出數(shù)據(jù)。幸運(yùn)的是CompletionService幫你做了這件事情。

CompletionService整合了Executor和BlockingQueue的功能。你可以將Callable任務(wù)提交給它去執(zhí)行,然后使用類似于隊(duì)列中的take和poll方法,在結(jié)果完整可用時(shí)獲得這個(gè)結(jié)果,像一個(gè)打包的Future。

CompletionService的take返回的future是哪個(gè)先完成就先返回哪一個(gè),而不是根據(jù)提交順序。

例子:

使用CompletionService結(jié)合ExecutorService批處理任務(wù)

 1 import java.util.Random; 2 import java.util.concurrent.Callable; 3 import java.util.concurrent.CompletionService; 4 import java.util.concurrent.ExecutionException; 5 import java.util.concurrent.ExecutorCompletionService; 6 import java.util.concurrent.ExecutorService; 7 import java.util.concurrent.Executors; 8   9 public class CallableAndFuture {10  11         public static void main(String[] args) {12               ExecutorService threadPool = Executors. newFixedThreadPool(10);13               CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(threadPool);14  15                for (int i = 0; i < 10; i++) {16                       final int seq = i;17                      System. out.println("開始提交第" + seq + "個(gè)任務(wù)");18                      completionService.submit( new Callable<Integer>() {19  20                             @Override21                             public Integer call() throws Exception {22                                   Thread. sleep(new Random().nextInt(5000));23                                    return seq;24                            }25                      });26               }27  28                for (int i = 0; i < 10; i++) {29                       try {30                             // 取出并移除表示下一個(gè)已完成任務(wù)的 Future,如果目前不存在這樣的任務(wù),則等待。31                            Integer seq = completionService.take().get();32                            System. out.println("第" + seq + "個(gè)任務(wù)返回");33                      } catch (InterruptedException e) {34                            e.printStackTrace();35                      } catch (ExecutionException e) {36                            e.printStackTrace();37                      }38               }39        }40  41 }

使用CompletionService結(jié)合ExecutorService批處理任務(wù)

 


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI