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