ExecutorCompletionService原理具体解释
生活随笔
收集整理的這篇文章主要介紹了
ExecutorCompletionService原理具体解释
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??? 在JDK并發包中有這么一個類ExecutorCompletionService,提交任務后,能夠按任務返回結果的先后順序來獲取各任務運行后的結果。
??? 該類實現了接口CompletionService:
public interface CompletionService<V> {Future<V> submit(Callable<V> task);Future<V> submit(Runnable task, V result);Future<V> take() throws InterruptedException;Future<V> poll();Future<V> poll(long timeout, TimeUnit unit) throws InterruptedException;}??? 該接口定義了一系列方法:提交實現了Callable或Runnable接口的任務。并獲取這些任務的結果。
??? ExecutorCompletionService實現了CompletionService。內部通過Executor以及BlockingQueue來實現接口提出的規范。當中,Executor由調用者傳遞進來。而Blocking能夠使用默認的LinkedBlockingQueue,也能夠由調用者傳遞。另外,該類還會將提交的任務封裝成QueueingFuture,這樣就能夠實現FutureTask.done()方法,以便于在任務運行完成后,將結果放入堵塞隊列中。
??? QueueingFuture為內部類:
private class QueueingFuture extends FutureTask<Void> {QueueingFuture(RunnableFuture<V> task) {super(task, null);this.task = task;}protected void done() { completionQueue.add(task); }private final Future<V> task;}??? 當中。done()方法就是在任務運行完成后,將任務放入隊列中。
??? 在提交任務時,將任務封裝成QueueingFuture:
public Future<V> submit(Callable<V> task) {if (task == null) throw new NullPointerException();RunnableFuture<V> f = newTaskFor(task);executor.execute(new QueueingFuture(f));return f;}??? 在調用take()、poll()方法時,會從堵塞隊列中獲取Future對象,以取得任務運行的結果。
總結
以上是生活随笔為你收集整理的ExecutorCompletionService原理具体解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gym - 101246D 博弈
- 下一篇: 反射常用API