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