1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 229957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 329957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * 429957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * This code is free software; you can redistribute it and/or modify it 529957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * under the terms of the GNU General Public License version 2 only, as 629957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * published by the Free Software Foundation. Oracle designates this 729957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * particular file as subject to the "Classpath" exception as provided 829957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * by Oracle in the LICENSE file that accompanied this code. 929957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * 1029957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * This code is distributed in the hope that it will be useful, but WITHOUT 1129957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1229957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1329957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * version 2 for more details (a copy is included in the LICENSE file that 1429957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * accompanied this code). 1529957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * 1629957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * You should have received a copy of the GNU General Public License version 1729957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * 2 along with this work; if not, write to the Free Software Foundation, 1829957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1929957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * 2029957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2129957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * or visit www.oracle.com if you need additional information or have any 2229957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * questions. 2329957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer */ 2429957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer 2529957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer/* 2629957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * This file is available under and governed by the GNU General Public 2729957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * License version 2 only, as published by the Free Software Foundation. 2829957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * However, the following notice accompanied the original version of this 2929957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * file: 3029957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Written by Doug Lea with assistance from members of JCP JSR-166 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Expert Group and released to the public domain, as explained at 33a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * http://creativecommons.org/publicdomain/zero/1.0/ 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util.concurrent; 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A {@link CompletionService} that uses a supplied {@link Executor} 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to execute tasks. This class arranges that submitted tasks are, 41bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * upon completion, placed on a queue accessible using {@code take}. 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The class is lightweight enough to be suitable for transient use 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when processing groups of tasks. 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <b>Usage Examples.</b> 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Suppose you have a set of solvers for a certain problem, each 50bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * returning a value of some type {@code Result}, and would like to 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * run them concurrently, processing the results of each of them that 52bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * return a non-null value, in some method {@code use(Result r)}. You 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * could write this as: 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 55bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <pre> {@code 56bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * void solve(Executor e, 57bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Collection<Callable<Result>> solvers) 58bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * throws InterruptedException, ExecutionException { 59b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * CompletionService<Result> ecs 60b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * = new ExecutorCompletionService<Result>(e); 61b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * for (Callable<Result> s : solvers) 62b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * ecs.submit(s); 63b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * int n = solvers.size(); 64b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * for (int i = 0; i < n; ++i) { 65b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * Result r = ecs.take().get(); 66b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * if (r != null) 67b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * use(r); 68b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * } 69bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * }}</pre> 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Suppose instead that you would like to use the first non-null result 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of the set of tasks, ignoring any that encounter exceptions, 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and cancelling all other tasks when the first one is ready: 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 75bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <pre> {@code 76bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * void solve(Executor e, 77bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Collection<Callable<Result>> solvers) 78bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * throws InterruptedException { 79b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * CompletionService<Result> ecs 80b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * = new ExecutorCompletionService<Result>(e); 81b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * int n = solvers.size(); 82b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * List<Future<Result>> futures = new ArrayList<>(n); 83b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * Result result = null; 84b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * try { 85b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * for (Callable<Result> s : solvers) 86b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * futures.add(ecs.submit(s)); 87b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * for (int i = 0; i < n; ++i) { 88b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * try { 89b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * Result r = ecs.take().get(); 90b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * if (r != null) { 91b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * result = r; 92b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * break; 93bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * } 94b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * } catch (ExecutionException ignore) {} 95bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * } 96b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * } 97b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * finally { 98b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * for (Future<Result> f : futures) 99b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * f.cancel(true); 100b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * } 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 102b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * if (result != null) 103b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * use(result); 104bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * }}</pre> 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class ExecutorCompletionService<V> implements CompletionService<V> { 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final Executor executor; 108bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson private final AbstractExecutorService aes; 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final BlockingQueue<Future<V>> completionQueue; 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 112b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * FutureTask extension to enqueue upon completion. 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 114b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak private static class QueueingFuture<V> extends FutureTask<Void> { 115b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak QueueingFuture(RunnableFuture<V> task, 116b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak BlockingQueue<Future<V>> completionQueue) { 117bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson super(task, null); 118bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson this.task = task; 119b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak this.completionQueue = completionQueue; 120bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 121ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak private final Future<V> task; 122b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak private final BlockingQueue<Future<V>> completionQueue; 123b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak protected void done() { completionQueue.add(task); } 124bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 125bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson 1266232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson private RunnableFuture<V> newTaskFor(Callable<V> task) { 1276232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson if (aes == null) 1286232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson return new FutureTask<V>(task); 1296232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson else 1306232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson return aes.newTaskFor(task); 131bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 132bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson 1336232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson private RunnableFuture<V> newTaskFor(Runnable task, V result) { 1346232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson if (aes == null) 1356232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson return new FutureTask<V>(task, result); 1366232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson else 1376232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson return aes.newTaskFor(task, result); 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates an ExecutorCompletionService using the supplied 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * executor for base task execution and a 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link LinkedBlockingQueue} as a completion queue. 144bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param executor the executor to use 146bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException if executor is {@code null} 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public ExecutorCompletionService(Executor executor) { 149bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson if (executor == null) 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.executor = executor; 152bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson this.aes = (executor instanceof AbstractExecutorService) ? 153bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson (AbstractExecutorService) executor : null; 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.completionQueue = new LinkedBlockingQueue<Future<V>>(); 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates an ExecutorCompletionService using the supplied 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * executor for base task execution and the supplied queue as its 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * completion queue. 161bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param executor the executor to use 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param completionQueue the queue to use as the completion queue 164bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * normally one dedicated for use by this service. This 165bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * queue is treated as unbounded -- failed attempted 166edf43d27e240d82106f39ae91404963c23987234Narayan Kamath * {@code Queue.add} operations for completed tasks cause 167bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * them not to be retrievable. 168bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException if executor or completionQueue are {@code null} 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public ExecutorCompletionService(Executor executor, 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BlockingQueue<Future<V>> completionQueue) { 172bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson if (executor == null || completionQueue == null) 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.executor = executor; 175bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson this.aes = (executor instanceof AbstractExecutorService) ? 176bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson (AbstractExecutorService) executor : null; 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.completionQueue = completionQueue; 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Future<V> submit(Callable<V> task) { 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (task == null) throw new NullPointerException(); 1826232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson RunnableFuture<V> f = newTaskFor(task); 183b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak executor.execute(new QueueingFuture<V>(f, completionQueue)); 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return f; 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Future<V> submit(Runnable task, V result) { 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (task == null) throw new NullPointerException(); 1896232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson RunnableFuture<V> f = newTaskFor(task, result); 190b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak executor.execute(new QueueingFuture<V>(f, completionQueue)); 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return f; 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Future<V> take() throws InterruptedException { 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return completionQueue.take(); 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Future<V> poll() { 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return completionQueue.poll(); 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2028eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson public Future<V> poll(long timeout, TimeUnit unit) 2038eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson throws InterruptedException { 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return completionQueue.poll(timeout, unit); 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 208