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 38e31b37859051d3902e06e4ba384995df7188917fHans Boehmimport dalvik.annotation.optimization.ReachabilitySensitive; 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.AccessControlContext; 40b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.security.AccessControlException; 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.AccessController; 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.PrivilegedAction; 43ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniakimport java.security.PrivilegedActionException; 44b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.security.PrivilegedExceptionAction; 45b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.Collection; 46b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.List; 47b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.concurrent.atomic.AtomicInteger; 48b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport sun.security.util.SecurityConstants; 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 50a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson// BEGIN android-note 51a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson// removed security manager docs 52a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson// END android-note 53b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Factory and utility methods for {@link Executor}, {@link 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ExecutorService}, {@link ScheduledExecutorService}, {@link 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ThreadFactory}, and {@link Callable} classes defined in this 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * package. This class supports the following kinds of methods: 59bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul> 61b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * <li>Methods that create and return an {@link ExecutorService} 62b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * set up with commonly useful configuration settings. 63b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * <li>Methods that create and return a {@link ScheduledExecutorService} 64b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * set up with commonly useful configuration settings. 65b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * <li>Methods that create and return a "wrapped" ExecutorService, that 66b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * disables reconfiguration by making implementation-specific methods 67b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * inaccessible. 68b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * <li>Methods that create and return a {@link ThreadFactory} 69b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * that sets newly created threads to a known state. 70b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * <li>Methods that create and return a {@link Callable} 71b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * out of other closure-like forms, so they can be used 72b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * in execution methods requiring {@code Callable}. 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since 1.5 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @author Doug Lea 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Executors { 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 81bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Creates a thread pool that reuses a fixed number of threads 82bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * operating off a shared unbounded queue. At any point, at most 8391770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * {@code nThreads} threads will be active processing tasks. 84bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * If additional tasks are submitted when all threads are active, 85bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * they will wait in the queue until a thread is available. 86bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * If any thread terminates due to a failure during execution 87bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * prior to shutdown, a new one will take its place if needed to 88bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * execute subsequent tasks. The threads in the pool will exist 89bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * until it is explicitly {@link ExecutorService#shutdown shutdown}. 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param nThreads the number of threads in the pool 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the newly created thread pool 938eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson * @throws IllegalArgumentException if {@code nThreads <= 0} 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static ExecutorService newFixedThreadPool(int nThreads) { 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new ThreadPoolExecutor(nThreads, nThreads, 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 0L, TimeUnit.MILLISECONDS, 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new LinkedBlockingQueue<Runnable>()); 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 10291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * Creates a thread pool that maintains enough threads to support 10391770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * the given parallelism level, and may use multiple queues to 10491770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * reduce contention. The parallelism level corresponds to the 10591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * maximum number of threads actively engaged in, or available to 10691770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * engage in, task processing. The actual number of threads may 10791770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * grow and shrink dynamically. A work-stealing pool makes no 10891770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * guarantees about the order in which submitted tasks are 10991770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * executed. 11091770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * 11191770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * @param parallelism the targeted parallelism level 11291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * @return the newly created thread pool 11391770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * @throws IllegalArgumentException if {@code parallelism <= 0} 11491770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * @since 1.8 11591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle */ 11691770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle public static ExecutorService newWorkStealingPool(int parallelism) { 11791770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle return new ForkJoinPool 11891770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle (parallelism, 11991770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle ForkJoinPool.defaultForkJoinWorkerThreadFactory, 12091770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle null, true); 12191770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle } 12291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle 12391770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle /** 124b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * Creates a work-stealing thread pool using the number of 125b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * {@linkplain Runtime#availableProcessors available processors} 12691770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * as its target parallelism level. 127b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * 12891770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * @return the newly created thread pool 129b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * @see #newWorkStealingPool(int) 13091770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * @since 1.8 13191770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle */ 13291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle public static ExecutorService newWorkStealingPool() { 13391770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle return new ForkJoinPool 13491770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle (Runtime.getRuntime().availableProcessors(), 13591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle ForkJoinPool.defaultForkJoinWorkerThreadFactory, 13691770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle null, true); 13791770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle } 13891770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle 13991770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle /** 140bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Creates a thread pool that reuses a fixed number of threads 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * operating off a shared unbounded queue, using the provided 142bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * ThreadFactory to create new threads when needed. At any point, 14391770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * at most {@code nThreads} threads will be active processing 144bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * tasks. If additional tasks are submitted when all threads are 145bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * active, they will wait in the queue until a thread is 146bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * available. If any thread terminates due to a failure during 147bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * execution prior to shutdown, a new one will take its place if 148bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * needed to execute subsequent tasks. The threads in the pool will 149bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * exist until it is explicitly {@link ExecutorService#shutdown 150bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * shutdown}. 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param nThreads the number of threads in the pool 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param threadFactory the factory to use when creating new threads 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the newly created thread pool 155bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException if threadFactory is null 1568eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson * @throws IllegalArgumentException if {@code nThreads <= 0} 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) { 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new ThreadPoolExecutor(nThreads, nThreads, 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 0L, TimeUnit.MILLISECONDS, 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new LinkedBlockingQueue<Runnable>(), 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project threadFactory); 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates an Executor that uses a single worker thread operating 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * off an unbounded queue. (Note however that if this single 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thread terminates due to a failure during execution prior to 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * shutdown, a new one will take its place if needed to execute 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * subsequent tasks.) Tasks are guaranteed to execute 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * sequentially, and no more than one task will be active at any 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * given time. Unlike the otherwise equivalent 17391770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * {@code newFixedThreadPool(1)} the returned executor is 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * guaranteed not to be reconfigurable to use additional threads. 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the newly created single-threaded Executor 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static ExecutorService newSingleThreadExecutor() { 179bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return new FinalizableDelegatedExecutorService 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (new ThreadPoolExecutor(1, 1, 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 0L, TimeUnit.MILLISECONDS, 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new LinkedBlockingQueue<Runnable>())); 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates an Executor that uses a single worker thread operating 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * off an unbounded queue, and uses the provided ThreadFactory to 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * create a new thread when needed. Unlike the otherwise 18991770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * equivalent {@code newFixedThreadPool(1, threadFactory)} the 190bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * returned executor is guaranteed not to be reconfigurable to use 191bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * additional threads. 192bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param threadFactory the factory to use when creating new 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * threads 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the newly created single-threaded Executor 197bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException if threadFactory is null 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) { 200bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return new FinalizableDelegatedExecutorService 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (new ThreadPoolExecutor(1, 1, 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 0L, TimeUnit.MILLISECONDS, 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new LinkedBlockingQueue<Runnable>(), 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project threadFactory)); 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a thread pool that creates new threads as needed, but 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will reuse previously constructed threads when they are 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * available. These pools will typically improve the performance 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of programs that execute many short-lived asynchronous tasks. 21291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * Calls to {@code execute} will reuse previously constructed 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * threads if available. If no existing thread is available, a new 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thread will be created and added to the pool. Threads that have 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not been used for sixty seconds are terminated and removed from 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the cache. Thus, a pool that remains idle for long enough will 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not consume any resources. Note that pools with similar 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * properties but different details (for example, timeout parameters) 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * may be created using {@link ThreadPoolExecutor} constructors. 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the newly created thread pool 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static ExecutorService newCachedThreadPool() { 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 60L, TimeUnit.SECONDS, 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new SynchronousQueue<Runnable>()); 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a thread pool that creates new threads as needed, but 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will reuse previously constructed threads when they are 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * available, and uses the provided 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ThreadFactory to create new threads when needed. 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param threadFactory the factory to use when creating new threads 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the newly created thread pool 236bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException if threadFactory is null 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) { 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 60L, TimeUnit.SECONDS, 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new SynchronousQueue<Runnable>(), 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project threadFactory); 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 244bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a single-threaded executor that can schedule commands 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to run after a given delay, or to execute periodically. 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (Note however that if this single 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thread terminates due to a failure during execution prior to 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * shutdown, a new one will take its place if needed to execute 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * subsequent tasks.) Tasks are guaranteed to execute 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * sequentially, and no more than one task will be active at any 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * given time. Unlike the otherwise equivalent 25491770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * {@code newScheduledThreadPool(1)} the returned executor is 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * guaranteed not to be reconfigurable to use additional threads. 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the newly created scheduled executor 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static ScheduledExecutorService newSingleThreadScheduledExecutor() { 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new DelegatedScheduledExecutorService 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (new ScheduledThreadPoolExecutor(1)); 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a single-threaded executor that can schedule commands 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to run after a given delay, or to execute periodically. (Note 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * however that if this single thread terminates due to a failure 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * during execution prior to shutdown, a new one will take its 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * place if needed to execute subsequent tasks.) Tasks are 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * guaranteed to execute sequentially, and no more than one task 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will be active at any given time. Unlike the otherwise 27191770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * equivalent {@code newScheduledThreadPool(1, threadFactory)} 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the returned executor is guaranteed not to be reconfigurable to 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * use additional threads. 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param threadFactory the factory to use when creating new 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * threads 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a newly created scheduled executor 277bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException if threadFactory is null 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) { 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new DelegatedScheduledExecutorService 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (new ScheduledThreadPoolExecutor(1, threadFactory)); 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 283bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 285bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Creates a thread pool that can schedule commands to run after a 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * given delay, or to execute periodically. 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param corePoolSize the number of threads to keep in the pool, 28891770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * even if they are idle 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a newly created scheduled thread pool 2908eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson * @throws IllegalArgumentException if {@code corePoolSize < 0} 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new ScheduledThreadPoolExecutor(corePoolSize); 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 297bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Creates a thread pool that can schedule commands to run after a 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * given delay, or to execute periodically. 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param corePoolSize the number of threads to keep in the pool, 30091770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * even if they are idle 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param threadFactory the factory to use when the executor 30291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * creates a new thread 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a newly created scheduled thread pool 3048eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson * @throws IllegalArgumentException if {@code corePoolSize < 0} 305bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException if threadFactory is null 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static ScheduledExecutorService newScheduledThreadPool( 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int corePoolSize, ThreadFactory threadFactory) { 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory); 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns an object that delegates all defined {@link 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ExecutorService} methods to the given executor, but not any 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * other methods that might otherwise be accessible using 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * casts. This provides a way to safely "freeze" configuration and 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * disallow tuning of a given concrete implementation. 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param executor the underlying implementation 31991770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * @return an {@code ExecutorService} instance 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException if executor null 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static ExecutorService unconfigurableExecutorService(ExecutorService executor) { 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (executor == null) 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new DelegatedExecutorService(executor); 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns an object that delegates all defined {@link 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ScheduledExecutorService} methods to the given executor, but 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not any other methods that might otherwise be accessible using 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * casts. This provides a way to safely "freeze" configuration and 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * disallow tuning of a given concrete implementation. 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param executor the underlying implementation 33591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * @return a {@code ScheduledExecutorService} instance 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException if executor null 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static ScheduledExecutorService unconfigurableScheduledExecutorService(ScheduledExecutorService executor) { 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (executor == null) 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new DelegatedScheduledExecutorService(executor); 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 343bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a default thread factory used to create new threads. 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This factory creates all new threads used by an Executor in the 347a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * same {@link ThreadGroup}. Each new 348bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * thread is created as a non-daemon thread with priority set to 34991770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * the smaller of {@code Thread.NORM_PRIORITY} and the maximum 350bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * priority permitted in the thread group. New threads have names 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * accessible via {@link Thread#getName} of 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>pool-N-thread-M</em>, where <em>N</em> is the sequence 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * number of this factory, and <em>M</em> is the sequence number 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of the thread created by this factory. 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a thread factory 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static ThreadFactory defaultThreadFactory() { 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new DefaultThreadFactory(); 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 362a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * Legacy security code; do not use. 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static ThreadFactory privilegedThreadFactory() { 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new PrivilegedThreadFactory(); 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a {@link Callable} object that, when 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * called, runs the given task and returns the given result. This 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * can be useful when applying methods requiring a 37291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * {@code Callable} to an otherwise resultless action. 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param task the task to run 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param result the result to return 375fd81a99407d318ea3d8b5782294a0644e580d126Neil Fuller * @param <T> the type of the result 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a callable object 377bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException if task null 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T> Callable<T> callable(Runnable task, T result) { 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (task == null) 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new RunnableAdapter<T>(task, result); 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a {@link Callable} object that, when 38791770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * called, runs the given task and returns {@code null}. 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param task the task to run 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a callable object 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException if task null 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static Callable<Object> callable(Runnable task) { 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (task == null) 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new RunnableAdapter<Object>(task, null); 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a {@link Callable} object that, when 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * called, runs the given privileged action and returns its result. 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param action the privileged action to run 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a callable object 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException if action null 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 4056232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson public static Callable<Object> callable(final PrivilegedAction<?> action) { 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (action == null) 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 408bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return new Callable<Object>() { 409bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson public Object call() { return action.run(); }}; 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a {@link Callable} object that, when 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * called, runs the given privileged exception action and returns 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * its result. 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param action the privileged exception action to run 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a callable object 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException if action null 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 4206232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson public static Callable<Object> callable(final PrivilegedExceptionAction<?> action) { 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (action == null) 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 423bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return new Callable<Object>() { 424bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson public Object call() throws Exception { return action.run(); }}; 425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 428a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * Legacy security code; do not use. 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T> Callable<T> privilegedCallable(Callable<T> callable) { 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (callable == null) 432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 433bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return new PrivilegedCallable<T>(callable); 434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 435bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 43791770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle * Legacy security code; do not use. 438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T> Callable<T> privilegedCallableUsingCurrentClassLoader(Callable<T> callable) { 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (callable == null) 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 442bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return new PrivilegedCallableUsingCurrentClassLoader<T>(callable); 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Non-public classes supporting the public methods 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 448b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * A callable that runs given task and returns given result. 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 450b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak private static final class RunnableAdapter<T> implements Callable<T> { 451b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak private final Runnable task; 452b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak private final T result; 453bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson RunnableAdapter(Runnable task, T result) { 454bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson this.task = task; 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.result = result; 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 457bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson public T call() { 458bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson task.run(); 459bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return result; 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 464b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * A callable that runs under established access control settings. 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 466b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak private static final class PrivilegedCallable<T> implements Callable<T> { 467b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final Callable<T> task; 468b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final AccessControlContext acc; 469bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson 470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project PrivilegedCallable(Callable<T> task) { 471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.task = task; 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.acc = AccessController.getContext(); 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public T call() throws Exception { 476bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson try { 477bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return AccessController.doPrivileged( 478bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson new PrivilegedExceptionAction<T>() { 479bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson public T run() throws Exception { 480bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return task.call(); 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 482bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson }, acc); 483bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } catch (PrivilegedActionException e) { 484bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson throw e.getException(); 485bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A callable that runs under established access control settings and 491b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * current ClassLoader. 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 493b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak private static final class PrivilegedCallableUsingCurrentClassLoader<T> 494b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak implements Callable<T> { 495b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final Callable<T> task; 496b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final AccessControlContext acc; 497b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ClassLoader ccl; 498bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project PrivilegedCallableUsingCurrentClassLoader(Callable<T> task) { 5006975f84c2ed72e1e26d20190b6f318718c849008Tobias Thierer // BEGIN Android-removed 501a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // SecurityManager sm = System.getSecurityManager(); 502a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // if (sm != null) { 503a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // // Calls to getContextClassLoader from this class 504a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // // never trigger a security check, but we check 505a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // // whether our callers have this permission anyways. 506a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION); 507b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak 508a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // // Whether setContextClassLoader turns out to be necessary 509a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // // or not, we fail fast if permission is not available. 510a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // sm.checkPermission(new RuntimePermission("setContextClassLoader")); 511a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // } 5126975f84c2ed72e1e26d20190b6f318718c849008Tobias Thierer // END Android-removed 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.task = task; 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.acc = AccessController.getContext(); 515bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson this.ccl = Thread.currentThread().getContextClassLoader(); 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public T call() throws Exception { 519bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson try { 520bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return AccessController.doPrivileged( 521bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson new PrivilegedExceptionAction<T>() { 522bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson public T run() throws Exception { 523bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson Thread t = Thread.currentThread(); 52491770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle ClassLoader cl = t.getContextClassLoader(); 52591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle if (ccl == cl) { 526bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return task.call(); 52791770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle } else { 52891770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle t.setContextClassLoader(ccl); 52991770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle try { 53091770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle return task.call(); 53191770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle } finally { 53291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle t.setContextClassLoader(cl); 53391770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle } 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 536bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson }, acc); 537bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } catch (PrivilegedActionException e) { 538bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson throw e.getException(); 539bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 544b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * The default thread factory. 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 546b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak private static class DefaultThreadFactory implements ThreadFactory { 547bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson private static final AtomicInteger poolNumber = new AtomicInteger(1); 548bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson private final ThreadGroup group; 549bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson private final AtomicInteger threadNumber = new AtomicInteger(1); 550bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson private final String namePrefix; 551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DefaultThreadFactory() { 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecurityManager s = System.getSecurityManager(); 5548eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson group = (s != null) ? s.getThreadGroup() : 5558eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson Thread.currentThread().getThreadGroup(); 556bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson namePrefix = "pool-" + 557bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson poolNumber.getAndIncrement() + 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "-thread-"; 559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Thread newThread(Runnable r) { 562bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson Thread t = new Thread(group, r, 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project namePrefix + threadNumber.getAndIncrement(), 564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 0); 565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (t.isDaemon()) 566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project t.setDaemon(false); 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (t.getPriority() != Thread.NORM_PRIORITY) 568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project t.setPriority(Thread.NORM_PRIORITY); 569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return t; 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 574b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * Thread factory capturing access control context and class loader. 575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 576b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak private static class PrivilegedThreadFactory extends DefaultThreadFactory { 577b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final AccessControlContext acc; 578b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ClassLoader ccl; 579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project PrivilegedThreadFactory() { 581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(); 5826975f84c2ed72e1e26d20190b6f318718c849008Tobias Thierer // BEGIN Android-removed 583a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // SecurityManager sm = System.getSecurityManager(); 584a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // if (sm != null) { 585a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // // Calls to getContextClassLoader from this class 586a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // // never trigger a security check, but we check 587a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // // whether our callers have this permission anyways. 588a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION); 589b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak 590a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // // Fail fast 591a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // sm.checkPermission(new RuntimePermission("setContextClassLoader")); 592a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson // } 5936975f84c2ed72e1e26d20190b6f318718c849008Tobias Thierer // END Android-removed 594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.acc = AccessController.getContext(); 595bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson this.ccl = Thread.currentThread().getContextClassLoader(); 596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 597bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson 598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Thread newThread(final Runnable r) { 599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return super.newThread(new Runnable() { 600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void run() { 601bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson AccessController.doPrivileged(new PrivilegedAction<Void>() { 602bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson public Void run() { 603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Thread.currentThread().setContextClassLoader(ccl); 604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project r.run(); 605bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return null; 606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }, acc); 608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }); 610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 613bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson /** 614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A wrapper class that exposes only the ExecutorService methods 615bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * of an ExecutorService implementation. 616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 617b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak private static class DelegatedExecutorService 618b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak extends AbstractExecutorService { 619e31b37859051d3902e06e4ba384995df7188917fHans Boehm // Android-added: @ReachabilitySensitive 620e31b37859051d3902e06e4ba384995df7188917fHans Boehm // Needed for FinalizableDelegatedExecutorService below. 621e31b37859051d3902e06e4ba384995df7188917fHans Boehm @ReachabilitySensitive 622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final ExecutorService e; 623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DelegatedExecutorService(ExecutorService executor) { e = executor; } 624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void execute(Runnable command) { e.execute(command); } 625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void shutdown() { e.shutdown(); } 626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public List<Runnable> shutdownNow() { return e.shutdownNow(); } 627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isShutdown() { return e.isShutdown(); } 628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isTerminated() { return e.isTerminated(); } 629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean awaitTermination(long timeout, TimeUnit unit) 630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InterruptedException { 631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return e.awaitTermination(timeout, unit); 632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Future<?> submit(Runnable task) { 634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return e.submit(task); 635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public <T> Future<T> submit(Callable<T> task) { 637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return e.submit(task); 638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public <T> Future<T> submit(Runnable task, T result) { 640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return e.submit(task, result); 641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 6426232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) 643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InterruptedException { 644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return e.invokeAll(tasks); 645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 6466232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, 647bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson long timeout, TimeUnit unit) 648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InterruptedException { 649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return e.invokeAll(tasks, timeout, unit); 650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 6516232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson public <T> T invokeAny(Collection<? extends Callable<T>> tasks) 652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InterruptedException, ExecutionException { 653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return e.invokeAny(tasks); 654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 6556232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson public <T> T invokeAny(Collection<? extends Callable<T>> tasks, 656bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson long timeout, TimeUnit unit) 657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InterruptedException, ExecutionException, TimeoutException { 658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return e.invokeAny(tasks, timeout, unit); 659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 661bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson 662b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak private static class FinalizableDelegatedExecutorService 663b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak extends DelegatedExecutorService { 664bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson FinalizableDelegatedExecutorService(ExecutorService executor) { 665bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson super(executor); 666bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 6678eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson protected void finalize() { 6688eb35c835be1345d3873a82cc9e42f944d698afdJesse Wilson super.shutdown(); 669bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 670bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 671bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson 672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 673bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * A wrapper class that exposes only the ScheduledExecutorService 674bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * methods of a ScheduledExecutorService implementation. 675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 676b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak private static class DelegatedScheduledExecutorService 677bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson extends DelegatedExecutorService 678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implements ScheduledExecutorService { 679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final ScheduledExecutorService e; 680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DelegatedScheduledExecutorService(ScheduledExecutorService executor) { 681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(executor); 682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project e = executor; 683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 68491770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) { 685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return e.schedule(command, delay, unit); 686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) { 688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return e.schedule(callable, delay, unit); 689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 69091770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) { 691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return e.scheduleAtFixedRate(command, initialDelay, period, unit); 692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 69391770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) { 694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return e.scheduleWithFixedDelay(command, initialDelay, delay, unit); 695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** Cannot instantiate. */ 699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Executors() {} 700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 701