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