Simple Thread Management - Java - Android
The reason for the RejectedExecutionException
is because AsyncTask
implements a thread pool of its own (per Mr. Martelli's answer), but one that is capped at a maximum of 10 simultaneous tasks. Why they have that limit, I have no idea.
Hence, one possibility is for you to clone AsyncTask
, raise the limit (or go unbounded, which is also possible with LinkedBlockingQueue
), and use your clone. Then, perhaps, submit the change as a patch to AsyncTask
for future Android releases.
Click here to run a Google Code Search for AsyncTask
-- the first hit should be the implementation.
If you just want to raise the limit, adjust MAXIMUM_POOL_SIZE
to be as big as you're likely to need. If you want to go unbounded, use the zero-argument LinkedBlockingQueue
constructor instead of the one being presently used. AFAICT, the rest of the code probably stays the same.
You seem to have implemented a version of the Thread Pool design pattern -- the wikipedia article points to many helpful articles on the subject, which may help you refine your implementation. I also recommend this Java-specific article which has clear code and explanation.