Android 获取默认线程池执行器?
我正在制作一个Android应用程序,出现了Android 获取默认线程池执行器?,android,threadpoolexecutor,Android,Threadpoolexecutor,我正在制作一个Android应用程序,出现了拒绝执行异常(可能是因为过度使用了异步任务)。我想获取默认的ThreadPoolExecutor并读取getTaskCount()和getCompletedTaskCount() 在没有手动创建的情况下,如何获取ThreadPoolExecutor的实例?就在异步任务的文档中。有两个。他们被称为 AsyncTask.SERIAL_EXECUTOR 及 分别 请注意,这两个执行器都使用完全相同的多线程支持执行器执行。串行执行器不是单线程的!它只是在前面
拒绝执行异常
(可能是因为过度使用了异步任务
)。我想获取默认的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核)
THREAD\u POOL\u EXECUTOR
,但请注意,这只能在SDK=>11中使用,因为它是一种更新的方法。这将解决您眼前的问题,但如果需要那么多线程,您可能需要重新考虑。如果您有许多长时间运行的任务,请使用其他方法,例如服务
或者,如果您想要自己的线程池,您可以使用执行器创建一个线程池:例如(在其他静态构造函数中) 请注意,串行执行器和线程池执行器使用完全相同的多线程执行器。串行执行器前面有一个出列,这样任务就可以串行执行。
AsyncTask.THREAD_POOL_EXECUTOR