我很好奇,是否有人对AsyncTask
内置的Android平台Executor
为何没有限制或数量不受限制有何见解?他们可以处理的AsyncTask
个已排队。
THREAD_POOL_EXECUTOR
initially在Android的早期版本中的LinkedBlockingQueue
限制为10。 Since KitKat,上限为128。
SERIAL_EXECUTOR
的{{1}}具有never had a limit,因为它是作为默认的ArrayDeque
AsyncTask
在Honeycomb中引入的。
Executor
的{{3}}没有提供限制其容量的方法。但是ArrayDeque
的{{3}}将提供LinkedBlockingQueue
的默认队列容量限制(2,147,483,647),基本上是无限的。
如果有的话,Integer.MAX_VALUE
更有可能被SERIAL_EXECUTOR
Runnable
备份,因为它们无法并行执行。但是,如果有太多任务排队等待执行,那么两者同样可以耗尽内存。 AsyncTask
很快就达到了它的极限,一旦队列超过了128个极限,就抛出一个THREAD_POOL_EXECUTOR
,而RejectedExecutionException
将能够继续添加任务,直到内存用完。 / p>
我有一个用例,我需要快速排队几百个需要异步运行的渲染任务。使用SERIAL_EXECUTOR
的默认AsyncTask
很好。但是这些渲染任务可以并且理想情况下应该并行运行,因为它们没有共享状态。如果我更改代码以使用SERIAL_EXECUTOR
的{{1}},则应用会崩溃,并显示:AsyncTask
。
除了不限制其队列容量之外,是否有任何我不想创建自己的THREAD_POOL_EXECUTOR
并镜像java.util.concurrent.RejectedExecutionException: Task android.os.AsyncTask$3@b4d342c rejected from java.util.concurrent.ThreadPoolExecutor@bcccef5[Running, pool size = 9, active threads = 9, queued tasks = 128, completed tasks = 53]
的原因?