为什么AsyncTask的THREAD_POOL_EXECUTOR没有队列限制,而SERIAL_EXECUTOR没有队列限制?

时间:2019-01-23 22:24:29

标签: android android-asynctask executor

我很好奇,是否有人对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]的原因?

0 个答案:

没有答案