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;
37edf43d27e240d82106f39ae91404963c23987234Narayan Kamath
38b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport static java.util.concurrent.TimeUnit.NANOSECONDS;
39b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
40b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.ArrayList;
41b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.Collection;
42b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.Iterator;
43b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.List;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
46bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Provides default implementations of {@link ExecutorService}
4791770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * execution methods. This class implements the {@code submit},
4891770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * {@code invokeAny} and {@code invokeAll} methods using a
4991770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * {@link RunnableFuture} returned by {@code newTaskFor}, which defaults
506232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * to the {@link FutureTask} class provided in this package.  For example,
5191770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * the implementation of {@code submit(Runnable)} creates an
5291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * associated {@code RunnableFuture} that is executed and
5391770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * returned. Subclasses may override the {@code newTaskFor} methods
5491770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * to return {@code RunnableFuture} implementations other than
5591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * {@code FutureTask}.
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
5791770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * <p><b>Extension example</b>. Here is a sketch of a class
586232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * that customizes {@link ThreadPoolExecutor} to use
5991770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * a {@code CustomTask} class instead of the default {@code FutureTask}:
60b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * <pre> {@code
616232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson * public class CustomThreadPoolExecutor extends ThreadPoolExecutor {
626232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson *
638eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson *   static class CustomTask<V> implements RunnableFuture<V> {...}
646232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson *
658eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson *   protected <V> RunnableFuture<V> newTaskFor(Callable<V> c) {
668eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson *       return new CustomTask<V>(c);
676232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson *   }
688eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson *   protected <V> RunnableFuture<V> newTaskFor(Runnable r, V v) {
698eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson *       return new CustomTask<V>(r, v);
706232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson *   }
716232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson *   // ... add constructors, etc.
728eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson * }}</pre>
738eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson *
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since 1.5
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @author Doug Lea
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class AbstractExecutorService implements ExecutorService {
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
79bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    /**
8091770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle     * Returns a {@code RunnableFuture} for the given runnable and default
816232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * value.
826232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     *
836232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * @param runnable the runnable task being wrapped
846232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * @param value the default value for the returned future
85fd81a99407d318ea3d8b5782294a0644e580d126Neil Fuller     * @param <T> the type of the given value
8691770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle     * @return a {@code RunnableFuture} which, when run, will run the
8791770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle     * underlying runnable and which, as a {@code Future}, will yield
886232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * the given value as its result and provide for cancellation of
8991770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle     * the underlying task
906232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * @since 1.6
916232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     */
926232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
936232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        return new FutureTask<T>(runnable, value);
946232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    }
956232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
966232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    /**
9791770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle     * Returns a {@code RunnableFuture} for the given callable task.
986232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     *
996232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * @param callable the callable task being wrapped
100fd81a99407d318ea3d8b5782294a0644e580d126Neil Fuller     * @param <T> the type of the callable's result
10191770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle     * @return a {@code RunnableFuture} which, when run, will call the
10291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle     * underlying callable and which, as a {@code Future}, will yield
1036232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * the callable's result as its result and provide for
10491770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle     * cancellation of the underlying task
1056232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * @since 1.6
1066232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     */
1076232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
1086232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        return new FutureTask<T>(callable);
1096232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    }
1106232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
1116232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    /**
112bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws RejectedExecutionException {@inheritDoc}
113bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws NullPointerException       {@inheritDoc}
114bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     */
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Future<?> submit(Runnable task) {
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (task == null) throw new NullPointerException();
1178eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson        RunnableFuture<Void> ftask = newTaskFor(task, null);
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        execute(ftask);
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ftask;
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
122bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    /**
123bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws RejectedExecutionException {@inheritDoc}
124bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws NullPointerException       {@inheritDoc}
125bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     */
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public <T> Future<T> submit(Runnable task, T result) {
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (task == null) throw new NullPointerException();
1286232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        RunnableFuture<T> ftask = newTaskFor(task, result);
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        execute(ftask);
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ftask;
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
133bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    /**
134bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws RejectedExecutionException {@inheritDoc}
135bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws NullPointerException       {@inheritDoc}
136bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     */
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public <T> Future<T> submit(Callable<T> task) {
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (task == null) throw new NullPointerException();
1396232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        RunnableFuture<T> ftask = newTaskFor(task);
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        execute(ftask);
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ftask;
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the main mechanics of invokeAny.
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1476232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    private <T> T doInvokeAny(Collection<? extends Callable<T>> tasks,
14891770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle                              boolean timed, long nanos)
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws InterruptedException, ExecutionException, TimeoutException {
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (tasks == null)
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int ntasks = tasks.size();
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (ntasks == 0)
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
155b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        ArrayList<Future<T>> futures = new ArrayList<>(ntasks);
156bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        ExecutorCompletionService<T> ecs =
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ExecutorCompletionService<T>(this);
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // For efficiency, especially in executors with limited
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // parallelism, check to see if previously submitted tasks are
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // done before submitting more of them. This interleaving
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // plus the exception mechanics account for messiness of main
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // loop.
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Record exceptions so that if we fail to obtain any
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // result, we can throw the last exception we got.
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ExecutionException ee = null;
16991770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle            final long deadline = timed ? System.nanoTime() + nanos : 0L;
1706232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson            Iterator<? extends Callable<T>> it = tasks.iterator();
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Start one task for sure; the rest incrementally
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            futures.add(ecs.submit(it.next()));
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            --ntasks;
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int active = 1;
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (;;) {
178bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                Future<T> f = ecs.poll();
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (f == null) {
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (ntasks > 0) {
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        --ntasks;
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        futures.add(ecs.submit(it.next()));
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        ++active;
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
185bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                    else if (active == 0)
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        break;
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    else if (timed) {
188b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        f = ecs.poll(nanos, NANOSECONDS);
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        if (f == null)
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            throw new TimeoutException();
19191770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle                        nanos = deadline - System.nanoTime();
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
193bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                    else
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        f = ecs.take();
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (f != null) {
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    --active;
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    try {
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return f.get();
200bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                    } catch (ExecutionException eex) {
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        ee = eex;
202bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                    } catch (RuntimeException rex) {
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        ee = new ExecutionException(rex);
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
206bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            }
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (ee == null)
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ee = new ExecutionException();
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw ee;
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
213b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            cancelAll(futures);
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2176232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws InterruptedException, ExecutionException {
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return doInvokeAny(tasks, false, 0);
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (TimeoutException cannotHappen) {
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assert false;
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2276232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    public <T> T invokeAny(Collection<? extends Callable<T>> tasks,
228bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                           long timeout, TimeUnit unit)
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws InterruptedException, ExecutionException, TimeoutException {
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return doInvokeAny(tasks, true, unit.toNanos(timeout));
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2336232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws InterruptedException {
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (tasks == null)
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
237b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        ArrayList<Future<T>> futures = new ArrayList<>(tasks.size());
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (Callable<T> t : tasks) {
2406232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                RunnableFuture<T> f = newTaskFor(t);
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                futures.add(f);
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                execute(f);
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
24491770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle            for (int i = 0, size = futures.size(); i < size; i++) {
24591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle                Future<T> f = futures.get(i);
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (!f.isDone()) {
247b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    try { f.get(); }
248b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    catch (CancellationException ignore) {}
249b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    catch (ExecutionException ignore) {}
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return futures;
253b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        } catch (Throwable t) {
254b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            cancelAll(futures);
255b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            throw t;
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2596232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
260bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                                         long timeout, TimeUnit unit)
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws InterruptedException {
26291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle        if (tasks == null)
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
264b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final long nanos = unit.toNanos(timeout);
265b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final long deadline = System.nanoTime() + nanos;
266b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        ArrayList<Future<T>> futures = new ArrayList<>(tasks.size());
267b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        int j = 0;
268b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        timedOut: try {
269bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            for (Callable<T> t : tasks)
2706232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                futures.add(newTaskFor(t));
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
27291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle            final int size = futures.size();
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Interleave time checks and calls to execute in case
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // executor doesn't have any/much parallelism.
27691770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle            for (int i = 0; i < size; i++) {
277b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                if (((i == 0) ? nanos : deadline - System.nanoTime()) <= 0L)
278b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    break timedOut;
27991770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle                execute((Runnable)futures.get(i));
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
282b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            for (; j < size; j++) {
283b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                Future<T> f = futures.get(j);
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (!f.isDone()) {
285b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    try { f.get(deadline - System.nanoTime(), NANOSECONDS); }
286b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    catch (CancellationException ignore) {}
287b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    catch (ExecutionException ignore) {}
288b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    catch (TimeoutException timedOut) {
289b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        break timedOut;
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return futures;
294b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        } catch (Throwable t) {
295b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            cancelAll(futures);
296b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            throw t;
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
298b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        // Timed out before all the tasks could be completed; cancel remaining
299b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        cancelAll(futures, j);
300b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        return futures;
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
303b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    private static <T> void cancelAll(ArrayList<Future<T>> futures) {
304b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        cancelAll(futures, 0);
305b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    }
306b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
307b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    /** Cancels all futures with index at least j. */
308b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    private static <T> void cancelAll(ArrayList<Future<T>> futures, int j) {
309b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        for (int size = futures.size(); j < size; j++)
310b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            futures.get(j).cancel(true);
311b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    }
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
313