Android 获取默认线程池执行器?

Android 获取默认线程池执行器?,android,threadpoolexecutor,Android,Threadpoolexecutor,我正在制作一个Android应用程序,出现了拒绝执行异常(可能是因为过度使用了异步任务)。我想获取默认的ThreadPoolExecutor并读取getTaskCount()和getCompletedTaskCount() 在没有手动创建的情况下,如何获取ThreadPoolExecutor的实例?就在异步任务的文档中。有两个。他们被称为 AsyncTask.SERIAL_EXECUTOR 及 分别 请注意,这两个执行器都使用完全相同的多线程支持执行器执行。串行执行器不是单线程的!它只是在前面

我正在制作一个Android应用程序,出现了
拒绝执行异常
(可能是因为过度使用了
异步任务
)。我想获取默认的
ThreadPoolExecutor
并读取
getTaskCount()
getCompletedTaskCount()


在没有手动创建的情况下,如何获取ThreadPoolExecutor的实例?

就在异步任务的文档中。有两个。他们被称为

AsyncTask.SERIAL_EXECUTOR

分别


请注意,这两个执行器都使用完全相同的多线程支持执行器执行。串行执行器不是单线程的!它只是在前面有一个出列,强制串行执行任务。

Android AsyncTask框架有两个默认执行器:
SerialExecutor
ThreadPoolExecutor
。AsynkTask使用不同的执行器作为默认执行器,具体取决于平台

从DONUT开始,它被更改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务返回到在单个线程上执行,以避免并行执行导致的常见应用程序错误

您可以使用此命令强制select executor在所需的执行器中执行任务
您可以将
AsycTask.SERIAL_EXECUTOR
AsycTask.THREAD_POOL_EXECUTOR
传递到此函数。之后,您可以根据自己的需要使用它。

您将获得
拒绝执行异常
,因为线程池的等待队列已满,您尝试发布另一个任务。您应该从这里开始重构/重新思考代码,因为在大多数情况下,加上活动线程就足够了。很可能您的某些任务未完成或在任务中长时间运行,并阻止其他任务,或者您疯狂地发布线程;)

Asynctask有2个内置线程池:

  • -单线程池
  • -并发执行多达128个线程(5核)
在SDK>11中,默认为串行执行器。因此,您可能会尝试
THREAD\u POOL\u EXECUTOR
,但请注意,这只能在SDK=>11中使用,因为它是一种更新的方法。这将解决您眼前的问题,但如果需要那么多线程,您可能需要重新考虑。如果您有许多长时间运行的任务,请使用其他方法,例如服务


或者,如果您想要自己的线程池,您可以使用执行器创建一个线程池:例如(在其他静态构造函数中)

请注意,串行执行器和线程池执行器使用完全相同的多线程执行器。串行执行器前面有一个出列,这样任务就可以串行执行。
AsyncTask.THREAD_POOL_EXECUTOR