AbstractExecutorService.java revision edf43d27e240d82106f39ae91404963c23987234
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Written by Doug Lea with assistance from members of JCP JSR-166 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Expert Group and released to the public domain, as explained at 4a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * http://creativecommons.org/publicdomain/zero/1.0/ 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util.concurrent; 8edf43d27e240d82106f39ae91404963c23987234Narayan Kamath 98eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilsonimport java.util.*; 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 12bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Provides default implementations of {@link ExecutorService} 1391770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * execution methods. This class implements the {@code submit}, 1491770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * {@code invokeAny} and {@code invokeAll} methods using a 1591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * {@link RunnableFuture} returned by {@code newTaskFor}, which defaults 166232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * to the {@link FutureTask} class provided in this package. For example, 1791770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * the implementation of {@code submit(Runnable)} creates an 1891770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * associated {@code RunnableFuture} that is executed and 1991770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * returned. Subclasses may override the {@code newTaskFor} methods 2091770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * to return {@code RunnableFuture} implementations other than 2191770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * {@code FutureTask}. 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 2391770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * <p><b>Extension example</b>. Here is a sketch of a class 246232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * that customizes {@link ThreadPoolExecutor} to use 2591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * a {@code CustomTask} class instead of the default {@code FutureTask}: 268eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson * <pre> {@code 276232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * public class CustomThreadPoolExecutor extends ThreadPoolExecutor { 286232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * 298eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson * static class CustomTask<V> implements RunnableFuture<V> {...} 306232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * 318eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson * protected <V> RunnableFuture<V> newTaskFor(Callable<V> c) { 328eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson * return new CustomTask<V>(c); 336232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * } 348eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson * protected <V> RunnableFuture<V> newTaskFor(Runnable r, V v) { 358eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson * return new CustomTask<V>(r, v); 366232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * } 376232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * // ... add constructors, etc. 388eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson * }}</pre> 398eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson * 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since 1.5 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @author Doug Lea 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class AbstractExecutorService implements ExecutorService { 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 45bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson /** 4691770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * Returns a {@code RunnableFuture} for the given runnable and default 476232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * value. 486232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * 496232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * @param runnable the runnable task being wrapped 506232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * @param value the default value for the returned future 5191770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * @return a {@code RunnableFuture} which, when run, will run the 5291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * underlying runnable and which, as a {@code Future}, will yield 536232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * the given value as its result and provide for cancellation of 5491770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * the underlying task 556232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * @since 1.6 566232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson */ 576232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) { 586232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson return new FutureTask<T>(runnable, value); 596232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson } 606232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson 616232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson /** 6291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * Returns a {@code RunnableFuture} for the given callable task. 636232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * 646232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * @param callable the callable task being wrapped 6591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * @return a {@code RunnableFuture} which, when run, will call the 6691770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * underlying callable and which, as a {@code Future}, will yield 676232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * the callable's result as its result and provide for 6891770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * cancellation of the underlying task 696232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * @since 1.6 706232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson */ 716232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) { 726232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson return new FutureTask<T>(callable); 736232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson } 746232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson 756232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson /** 76bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws RejectedExecutionException {@inheritDoc} 77bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException {@inheritDoc} 78bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson */ 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Future<?> submit(Runnable task) { 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (task == null) throw new NullPointerException(); 818eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson RunnableFuture<Void> ftask = newTaskFor(task, null); 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project execute(ftask); 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ftask; 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 86bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson /** 87bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws RejectedExecutionException {@inheritDoc} 88bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException {@inheritDoc} 89bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson */ 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public <T> Future<T> submit(Runnable task, T result) { 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (task == null) throw new NullPointerException(); 926232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson RunnableFuture<T> ftask = newTaskFor(task, result); 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project execute(ftask); 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ftask; 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 97bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson /** 98bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws RejectedExecutionException {@inheritDoc} 99bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException {@inheritDoc} 100bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson */ 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public <T> Future<T> submit(Callable<T> task) { 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (task == null) throw new NullPointerException(); 1036232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson RunnableFuture<T> ftask = newTaskFor(task); 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project execute(ftask); 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ftask; 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the main mechanics of invokeAny. 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1116232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson private <T> T doInvokeAny(Collection<? extends Callable<T>> tasks, 11291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle boolean timed, long nanos) 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InterruptedException, ExecutionException, TimeoutException { 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (tasks == null) 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int ntasks = tasks.size(); 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (ntasks == 0) 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(); 11991770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle ArrayList<Future<T>> futures = new ArrayList<Future<T>>(ntasks); 120bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson ExecutorCompletionService<T> ecs = 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new ExecutorCompletionService<T>(this); 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // For efficiency, especially in executors with limited 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // parallelism, check to see if previously submitted tasks are 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // done before submitting more of them. This interleaving 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // plus the exception mechanics account for messiness of main 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // loop. 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Record exceptions so that if we fail to obtain any 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // result, we can throw the last exception we got. 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ExecutionException ee = null; 13391770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle final long deadline = timed ? System.nanoTime() + nanos : 0L; 1346232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson Iterator<? extends Callable<T>> it = tasks.iterator(); 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Start one task for sure; the rest incrementally 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project futures.add(ecs.submit(it.next())); 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project --ntasks; 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int active = 1; 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (;;) { 142bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson Future<T> f = ecs.poll(); 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (f == null) { 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (ntasks > 0) { 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project --ntasks; 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project futures.add(ecs.submit(it.next())); 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ++active; 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 149bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson else if (active == 0) 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else if (timed) { 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project f = ecs.poll(nanos, TimeUnit.NANOSECONDS); 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (f == null) 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new TimeoutException(); 15591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle nanos = deadline - System.nanoTime(); 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 157bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson else 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project f = ecs.take(); 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (f != null) { 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project --active; 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return f.get(); 164bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } catch (ExecutionException eex) { 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ee = eex; 166bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } catch (RuntimeException rex) { 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ee = new ExecutionException(rex); 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 170bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (ee == null) 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ee = new ExecutionException(); 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw ee; 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 17791770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle for (int i = 0, size = futures.size(); i < size; i++) 17891770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle futures.get(i).cancel(true); 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1826232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson public <T> T invokeAny(Collection<? extends Callable<T>> tasks) 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InterruptedException, ExecutionException { 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return doInvokeAny(tasks, false, 0); 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (TimeoutException cannotHappen) { 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assert false; 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1926232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson public <T> T invokeAny(Collection<? extends Callable<T>> tasks, 193bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson long timeout, TimeUnit unit) 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InterruptedException, ExecutionException, TimeoutException { 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return doInvokeAny(tasks, true, unit.toNanos(timeout)); 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1986232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InterruptedException { 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (tasks == null) 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 20291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle ArrayList<Future<T>> futures = new ArrayList<Future<T>>(tasks.size()); 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean done = false; 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (Callable<T> t : tasks) { 2066232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson RunnableFuture<T> f = newTaskFor(t); 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project futures.add(f); 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project execute(f); 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 21091770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle for (int i = 0, size = futures.size(); i < size; i++) { 21191770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle Future<T> f = futures.get(i); 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!f.isDone()) { 213bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson try { 214bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson f.get(); 215bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } catch (CancellationException ignore) { 216bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } catch (ExecutionException ignore) { 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project done = true; 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return futures; 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!done) 22491770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle for (int i = 0, size = futures.size(); i < size; i++) 22591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle futures.get(i).cancel(true); 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2296232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, 230bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson long timeout, TimeUnit unit) 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InterruptedException { 23291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle if (tasks == null) 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project long nanos = unit.toNanos(timeout); 23591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle ArrayList<Future<T>> futures = new ArrayList<Future<T>>(tasks.size()); 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean done = false; 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 238bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson for (Callable<T> t : tasks) 2396232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson futures.add(newTaskFor(t)); 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 24191770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle final long deadline = System.nanoTime() + nanos; 24291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle final int size = futures.size(); 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Interleave time checks and calls to execute in case 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // executor doesn't have any/much parallelism. 24691770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle for (int i = 0; i < size; i++) { 24791770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle execute((Runnable)futures.get(i)); 24891770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle nanos = deadline - System.nanoTime(); 24991770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle if (nanos <= 0L) 250bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return futures; 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 25391770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle for (int i = 0; i < size; i++) { 25491770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle Future<T> f = futures.get(i); 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!f.isDone()) { 25691770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle if (nanos <= 0L) 257bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return futures; 258bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson try { 259bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson f.get(nanos, TimeUnit.NANOSECONDS); 260bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } catch (CancellationException ignore) { 261bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } catch (ExecutionException ignore) { 262bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } catch (TimeoutException toe) { 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return futures; 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 26591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle nanos = deadline - System.nanoTime(); 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project done = true; 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return futures; 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!done) 27291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle for (int i = 0, size = futures.size(); i < size; i++) 27391770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle futures.get(i).cancel(true); 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 278