1. 程式人生 > >Executor框架(六)CompletionService 接口

Executor框架(六)CompletionService 接口

遍歷 all finally 構造方法 executors ++ nal 表示 提交

??CompletionService 接口是一個獨立的接口,並沒有擴展 ExecutorService 。 其默認實現類是ExecutorCompletionService;
??接口 CompletionService 的功能是:以異步的方式一邊執行未完成的任務,一邊記錄、處理已完成任務的結果。從而可以將 任務的執行 與 處理任務的執行結果 分離開來。簡單來說,CompletionService 就是監視著 Executor線程池執行的任務,用 BlockingQueue 將完成的任務的結果存儲下來。(當然,這個也可以是程序員自己去實現,但是要不斷遍歷與每個任務關聯的 Future,然後不斷去輪詢,判斷任務是否已經完成,比較繁瑣);

構造方法摘要

ExecutorCompletionService(Executor executor):
指定一個Executor 來執行任務,存儲完成的任務的完成隊列是 LinkedBlockingQueue ;
ExecutorCompletionService(Executor executor, BlockingQueue
指定了任務執行器 Executor 和 已完成的任務隊列 completionQueue

方法摘要

Future
提交一個 Callable 任務;一旦完成,便可以由take()、poll()方法獲取
Future
提交一個 Runnable 任務,並指定計算結果;
Future


獲取並移除表示下一個已完成任務的 Future,如果目前不存在這樣的任務,則等待。
Future
獲取並移除表示下一個已完成任務的 Future,如果不存在這樣的任務,則返回 null。
Future
獲取並移除表示下一個已完成任務的 Future,如果目前不存在這樣的任務,則將等待指定的時間(如果有必要)。。

@ Example
??下面的例子是這樣一個場景:程序提交了多個任務,但只要有一個任務完成並返回一個非空的結果,並可以忽略掉其余的任務。

 void solve(Executor e, Collection<Callable<Result>> solvers) throws
InterruptedException { CompletionService<Result> completionService = new ExecutorCompletionService<Result>(e); int n = solvers.size(); List<Future<Result>> futures = new ArrayList<Future<Result>>(n); Result result = null; try { //提交多個任務 for (Callable<Result> s : solvers) futures.add(completionService.submit(s)); // for (int i = 0; i < n; ++i) { try { //等待獲取一個已經完成的任務 Result r = completionService.take().get(); //判斷返回結果是否為空 if (r != null) { result = r; break; } } catch (ExecutionException ignore) {} } } finally { //取消所有任務 for (Future<Result> f : futures) f.cancel(true); } if (result != null) use(result); }

Executor框架(六)CompletionService 接口