# IdlingThreadPoolExecutor

Artifact: [androidx.test.espresso.idling:idling-concurrent](https://developer.android.com/jetpack/androidx/releases/test-espresso-idling) [View Source](https://cs.android.com/search?q=file:androidx/test/espresso/idling/concurrent/IdlingThreadPoolExecutor.java+class:androidx.test.espresso.idling.concurrent.IdlingThreadPoolExecutor)

*** ** * ** ***

<br />

```
public class IdlingThreadPoolExecutor extends ThreadPoolExecutor implements IdlingResource
```

<br />

|---|---|---|---|
| [java.lang.Object](https://developer.android.com/reference/java/lang/Object.html) ||||
| ↳ | [java.util.concurrent.AbstractExecutorService](https://developer.android.com/reference/java/util/concurrent/AbstractExecutorService.html) |||
|   | ↳ | [java.util.concurrent.ThreadPoolExecutor](https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html) ||
|   |   | ↳ | [androidx.test.espresso.idling.concurrent.IdlingThreadPoolExecutor](https://developer.android.com/reference/androidx/test/espresso/idling/concurrent/IdlingThreadPoolExecutor) |

*** ** * ** ***

A `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html` that can be registered as an `https://developer.android.com/reference/androidx/test/espresso/IdlingResource` with Espresso.

Overrides parent methods to monitor threads starting, and finishing execution. Uses `https://developer.android.com/reference/androidx/test/espresso/idling/CountingIdlingResource` to track number of active tasks.

## Summary

| ### Public constructors |
|---|
| `https://developer.android.com/reference/androidx/test/espresso/idling/concurrent/IdlingThreadPoolExecutor#IdlingThreadPoolExecutor(java.lang.String,int,int,long,java.util.concurrent.TimeUnit,java.util.concurrent.BlockingQueue<java.lang.Runnable>,java.util.concurrent.ThreadFactory)( https://developer.android.com/reference/java/lang/String.html resourceName, int corePoolSize, int maximumPoolSize, long keepAliveTime, https://developer.android.com/reference/java/util/concurrent/TimeUnit.html unit, https://developer.android.com/reference/java/util/concurrent/BlockingQueue.html<https://developer.android.com/reference/java/lang/Runnable.html> workQueue, https://developer.android.com/reference/java/util/concurrent/ThreadFactory.html threadFactory )` Creates a new `IdlingThreadPoolExecutor` with the given initial parameters and default rejected execution handler. |

| ### Public methods |
|---|---|
| `synchronized void` | `https://developer.android.com/reference/androidx/test/espresso/idling/concurrent/IdlingThreadPoolExecutor#execute(java.lang.Runnable)(https://developer.android.com/reference/java/lang/Runnable.html command)` |
| `https://developer.android.com/reference/java/lang/String.html` | `https://developer.android.com/reference/androidx/test/espresso/idling/concurrent/IdlingThreadPoolExecutor#getName()()` Returns the name of the resources (used for logging and idempotency of registration). |
| `boolean` | `https://developer.android.com/reference/androidx/test/espresso/idling/concurrent/IdlingThreadPoolExecutor#isIdleNow()()` Returns `true` if resource is currently idle. |
| `void` | `https://developer.android.com/reference/androidx/test/espresso/idling/concurrent/IdlingThreadPoolExecutor#registerIdleTransitionCallback(androidx.test.espresso.IdlingResource.ResourceCallback)( https://developer.android.com/reference/androidx/test/espresso/IdlingResource.ResourceCallback callback )` Registers the given `https://developer.android.com/reference/androidx/test/espresso/IdlingResource.ResourceCallback` with the resource. |

| ### Protected methods |
|---|---|
| `void` | `https://developer.android.com/reference/androidx/test/espresso/idling/concurrent/IdlingThreadPoolExecutor#afterExecute(java.lang.Runnable,java.lang.Throwable)(https://developer.android.com/reference/java/lang/Runnable.html r, https://developer.android.com/reference/java/lang/Throwable.html t)` |
| `void` | `https://developer.android.com/reference/androidx/test/espresso/idling/concurrent/IdlingThreadPoolExecutor#terminated()()` |

### Inherited methods

From [java.util.concurrent.AbstractExecutorService](https://developer.android.com/reference/java/util/concurrent/AbstractExecutorService.html) `https://developer.android.com/reference/java/util/List.html<https://developer.android.com/reference/java/util/concurrent/Future.html<T>>` `<T> https://developer.android.com/reference/java/util/concurrent/AbstractExecutorService.html#invokeAll(java.util.Collection&lt;? extends java.util.concurrent.Callable&lt;T&gt;&gt;)(https://developer.android.com/reference/java/util/Collection.html<https://developer.android.com/reference/java/util/concurrent/Callable.html<T>> tasks)` `T` `<T> https://developer.android.com/reference/java/util/concurrent/AbstractExecutorService.html#invokeAny(java.util.Collection&lt;? extends java.util.concurrent.Callable&lt;T&gt;&gt;)(https://developer.android.com/reference/java/util/Collection.html<https://developer.android.com/reference/java/util/concurrent/Callable.html<T>> tasks)` `https://developer.android.com/reference/java/util/concurrent/RunnableFuture.html<T>` `<T> https://developer.android.com/reference/java/util/concurrent/AbstractExecutorService.html#newTaskFor(java.lang.Runnable, T)(https://developer.android.com/reference/java/lang/Runnable.html runnable, T value)` `https://developer.android.com/reference/java/util/concurrent/Future.html<@https://developer.android.com/reference/androidx/annotation/NonNull ?>` `https://developer.android.com/reference/java/util/concurrent/AbstractExecutorService.html#submit(java.lang.Runnable)(https://developer.android.com/reference/java/lang/Runnable.html task)` `https://developer.android.com/reference/java/util/concurrent/Future.html<T>` `<T> https://developer.android.com/reference/java/util/concurrent/AbstractExecutorService.html#submit(java.lang.Runnable, T)(https://developer.android.com/reference/java/lang/Runnable.html task, T result)` From [java.util.concurrent.ExecutorService](https://developer.android.com/reference/java/util/concurrent/ExecutorService.html) `void` `https://developer.android.com/reference/java/util/concurrent/ExecutorService.html#close()()` From [java.util.concurrent.ThreadPoolExecutor](https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html) `void` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#allowCoreThreadTimeOut(boolean)(boolean value)` `boolean` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#allowsCoreThreadTimeOut()()` `boolean` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#awaitTermination(long, java.util.concurrent.TimeUnit)(long timeout, https://developer.android.com/reference/java/util/concurrent/TimeUnit.html unit)` `void` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#beforeExecute(java.lang.Thread, java.lang.Runnable)(https://developer.android.com/reference/java/lang/Thread.html t, https://developer.android.com/reference/java/lang/Runnable.html r)` `void` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#finalize()()`

**This method is deprecated.**
`int` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#getActiveCount()()` `long` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#getCompletedTaskCount()()` `int` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#getCorePoolSize()()` `long` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#getKeepAliveTime(java.util.concurrent.TimeUnit)(https://developer.android.com/reference/java/util/concurrent/TimeUnit.html unit)` `int` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#getLargestPoolSize()()` `int` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#getMaximumPoolSize()()` `int` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#getPoolSize()()` `https://developer.android.com/reference/java/util/concurrent/BlockingQueue.html<https://developer.android.com/reference/java/lang/Runnable.html>` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#getQueue()()` `https://developer.android.com/reference/java/util/concurrent/RejectedExecutionHandler.html` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#getRejectedExecutionHandler()()` `long` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#getTaskCount()()` `https://developer.android.com/reference/java/util/concurrent/ThreadFactory.html` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#getThreadFactory()()` `boolean` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#isShutdown()()` `boolean` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#isTerminated()()` `boolean` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#isTerminating()()` `int` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#prestartAllCoreThreads()()` `boolean` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#prestartCoreThread()()` `void` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#purge()()` `boolean` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#remove(java.lang.Runnable)(https://developer.android.com/reference/java/lang/Runnable.html task)` `void` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#setCorePoolSize(int)(int corePoolSize)` `void` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#setKeepAliveTime(long, java.util.concurrent.TimeUnit)(long time, https://developer.android.com/reference/java/util/concurrent/TimeUnit.html unit)` `void` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#setMaximumPoolSize(int)(int maximumPoolSize)` `void` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#setRejectedExecutionHandler(java.util.concurrent.RejectedExecutionHandler)(https://developer.android.com/reference/java/util/concurrent/RejectedExecutionHandler.html handler)` `void` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#setThreadFactory(java.util.concurrent.ThreadFactory)(https://developer.android.com/reference/java/util/concurrent/ThreadFactory.html threadFactory)` `void` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#shutdown()()` `https://developer.android.com/reference/java/util/List.html<https://developer.android.com/reference/java/lang/Runnable.html>` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#shutdownNow()()` `https://developer.android.com/reference/java/lang/String.html` `https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#toString()()`

## Public constructors

### IdlingThreadPoolExecutor

```
public IdlingThreadPoolExecutor(
    String resourceName,
    int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    ThreadFactory threadFactory
)
```

Creates a new `IdlingThreadPoolExecutor` with the given initial parameters and default rejected execution handler.

| Parameters |
|---|---|
| `https://developer.android.com/reference/java/lang/String.html resourceName` | the name of the executor (used for logging and idempotency of registration). |
| `int corePoolSize` | the number of threads to keep in the pool, even if they are idle, unless allowCoreThreadTimeOut is set. |
| `int maximumPoolSize` | the maximum number of threads to allow in the pool. |
| `long keepAliveTime` | when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating. |
| `https://developer.android.com/reference/java/util/concurrent/TimeUnit.html unit` | the time unit for the keepAliveTime argument. |
| `https://developer.android.com/reference/java/util/concurrent/BlockingQueue.html<https://developer.android.com/reference/java/lang/Runnable.html> workQueue` | the queue to use for holding tasks before they are executed. This queue will hold only the Runnable tasks submitted by the execute method. |
| `https://developer.android.com/reference/java/util/concurrent/ThreadFactory.html threadFactory` | the factory to use when the executor creates a new thread. |

## Public methods

### execute

```
synchronized public void execute(Runnable command)
```

### getName

```
public String getName()
```

Returns the name of the resources (used for logging and idempotency of registration).

### isIdleNow

```
public boolean isIdleNow()
```

Returns `true` if resource is currently idle. Espresso will **always** call this method from the main thread, therefore it should be non-blocking and return immediately.

### registerIdleTransitionCallback

```
public void registerIdleTransitionCallback(
    IdlingResource.ResourceCallback callback
)
```

Registers the given `https://developer.android.com/reference/androidx/test/espresso/IdlingResource.ResourceCallback` with the resource. Espresso will call this method:

- with its implementation of `https://developer.android.com/reference/androidx/test/espresso/IdlingResource.ResourceCallback` so it can be notified asynchronously that your resource is idle
- from the main thread, but you are free to execute the callback's onTransitionToIdle from any thread
- once (when it is initially given a reference to your IdlingResource)

You only need to call this upon transition from busy to idle - if the resource is already idle when the method is called invoking the call back is optional and has no significant impact.

## Protected methods

### afterExecute

```
protected void afterExecute(Runnable r, Throwable t)
```

### terminated

```
protected void terminated()
```