Executor框架(六)CompletionService 接口
阿新 • • 發佈:2018-03-01
遍歷 all finally 構造方法 executors ++ nal 表示 提交
獲取並移除表示下一個已完成任務的 Future,如果目前不存在這樣的任務,則等待。
Future
獲取並移除表示下一個已完成任務的 Future,如果不存在這樣的任務,則返回 null。
Future
獲取並移除表示下一個已完成任務的 Future,如果目前不存在這樣的任務,則將等待指定的時間(如果有必要)。。
??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 接口