Home » Android » android – AsyncTask threads never die

android – AsyncTask threads never die

Posted by: admin March 11, 2020 Leave a comment


I’m using AsyncTasks to fetch data in response to the user pressing a button. This works well and keeps the interface responsive while fetching the data, but when I checked out what was going on in the Eclipse debugger, I found out that every time a new AsyncTask was created (which is quite often, because they can only be used once), a new thread was being created but never terminated.

The result is a large number of AsyncTask threads just sitting there. I’m not sure if this is a problem in practice or not, but I’d really like to get rid of those extra threads.

How can I kill these threads?

How to&Answers:

AsyncTask manages a thread pool, created with ThreadPoolExecutor. It will have from 5 to 128 threads. If there are more than 5 threads, those extra threads will stick around for at most 10 seconds before being removed. (note: these figures are for the presently-visible open source code and vary by Android release).

Leave the AsyncTask threads alone, please.


In addition to CommonsWare’s response:

Currently I’m using Android 2.2, and my application uses no more than one AsyncTask at any time, but I’m creating a new one every x minutes. At first new AsyncTask Threads start to appear (a new Thread for a new AsyncTask) but after 5 threads (as mentioned by CommonsWare) they just stay visible in the debug window, and get re-used when new AsyncTask threads are needed. They just stay there until the debugger disconnects.


Same symptom here. In my case the threads hanged around after I’d killed the Activity, and I was hoping for the App to close completely. Problem partly solved by using a single threaded executor:


This made the thread to vanish after the completing its work.


Use ThreadPoolExecutor.

BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size
ThreadPoolExecutor executor = new ThreadPoolExecutor(
            Runtime.getRuntime().availableProcessors(),       // Initial pool size
            Runtime.getRuntime().availableProcessors(),       // Max pool size
            1, // KEEP_ALIVE_TIME
            TimeUnit.SECONDS, //  KEEP_ALIVE_TIME_UNIT

Post your Runnable task by using execute() method.

void execute (Runnable command)

Executes the given task sometime in the future. The task may execute in a new thread or in an existing pooled thread

Regarding your second query:

How can I kill these threads?

Once you are done with all your work with ThreadPoolExecutor, shutdown it properly as quoted in below post:

How to properly shutdown java ExecutorService